0

この構造体を定義しましょう:

struct MyStruct {
    int firstInt;
    int secondInt;
    char * firstString;
    char * secondString;
};

私は次のような構造体を初期化しようとしています:

MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};

しかし、それは機能していません。それを行う方法はありますか?(firstStringの末尾に「\ 0」がないようにする必要があります)

4

4 に答える 4

4

要件は最後にnullターミネータを持たないことであるため、次の配列を使用する必要がありますfirstString

struct MyStruct {
    int firstInt;
    int secondInt;
    char firstString[3];
    char * secondString;
};

次に、次のように初期化できます。

MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};

文字のストレージを提供する必要があるため、char*で初期化することはできません。aは何かを指すことしかできません。たまたま読み取り専用メモリに格納されている定数文字列リテラルであるため、その点を指摘することができます。{'a', 'b', 'c'}char*"abc"char*

また、C ++では、"abc"は変更できない定数なので、に変更char * secondString;する必要がありますconst char * secondString;

于 2012-07-08T23:34:24.173 に答える
2

これには複合リテラルを使用できます。

struct MyStruct {
    int firstInt;
    int secondInt;
    char * firstString;
    char * secondString;
};

struct MyStruct s = { 4, 5, (char[]){'a', 'b', 'c'}, "abc" };

この構成はC99で導入されました。N1256ドラフトのセクション6.5.2.5を参照してください。一部のコンパイラ(特にMicrosoft)はそれをサポートしていない可能性があります。

Cでは、タイプstruct MyStructを単にMyStruct;と呼ぶことはできないことに注意してください。これはCとC++の違いです。自分が思っている言語をコンパイルしていることを確認してください。

注意すべき点の1つは、複合リテラルに関連付けられているオブジェクトの存続期間です。文字列リテラルは、静的な有効期間を持つ配列オブジェクトを示します。つまり、オブジェクトはプログラムの実行全体にわたって存在します。に関連付けられた配列オブジェクト(char[]){'a', 'b', 'c'}は、関数の本体の外側で発生した場合は静的ストレージ期間を持ちますが、関数の本体の側で発生した場合は(最も内側の囲みブロックに関連付けられた)自動ストレージ期間を持ちます。sこれは、それが定義されているブロックの外側にコピーを渡そうとした場合に問題になる可能性があります。

于 2012-07-08T23:53:05.673 に答える
0

微妙な点が生じます。構造体には2つchar *ありますが、これらのポインターをバックアップするためのストレージがありません。あなたはおそらくこのようなものが欲しいでしょう:

struct MyStruct {
    int firstInt;
    int secondInt;
    char firstString[3];
    char secondString[4];
};
于 2012-07-08T23:30:12.767 に答える
-1
#include <iostream>

using namespace std;

struct MyStruct {
    int firstInt;
    int secondInt;
    char * firstString;
    char * secondString;
};

int main()
{
    char arr[] = {'a', 'b', 'c','\0'};
    MyStruct s = {4, 5, arr, "abc"};

    cout << s.firstString << endl;

    return 0;
}

MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};

{'a', 'b', 'c'} have no memory to store.It's a r-value. 

- おもう。^-^

于 2012-07-08T23:57:02.247 に答える