2

C文字列の配列にメモリを割り当てようとしています。文字列が文字内に収まることは保証できますMAX_STRING_LENGTHが、コンパイル時に配列に含まれる文字列の数はわかりません(これは動的に計算されます)。コードを使用すると...

char *strings[MAX_STRING_LENGTH] = malloc( sizeof(char *) * numstrings );

...コンパイラは、これが無効な初期化子であると文句を言います。コードを使用すると...

char strings[MAX_STRING_LENGTH][] = malloc( sizeof(char *) * numstrings );

...コンパイラは不完全な要素型について文句を言います。ここで何が間違っているのでしょうか。また、この配列にメモリを割り当てるにはどうすればよいですか。

4

4 に答える 4

2

この宣言では:

char *strings[MAX_STRING_LENGTH] = malloc(sizeof(char *) * numstrings);

個々の文字列の長さではなく、カウントが である C 文字列の配列を定義しているかのように読み取りますMAX_STRING_LENGTH

**char次のようにa を定義することをお勧めします。

char **strings = malloc(sizeof(char *) * numstrings);

コードの後半で、たとえばスロット 5 に文字列を追加する準備ができたら、次のようにします。

strings[5] = malloc(sizeof(char) * MAX_STRING_LENGTH));

または次のような初期化ループで:

for (i = 0; i < numstrings; i++)
    strings[i] = malloc(sizeof(char) * MAX_STRING_LENGTH);

また、ある時点でより多くの文字列を格納するスペースが必要になった場合は、 を使用reallocして初期メモリ割り当てを増やします。

于 2012-07-24T17:56:28.600 に答える
2
char (*strings)[MAX_STRING_LENGTH] = malloc(sizeof *strings * num_strings);

複数レベルの割り当てを行う必要がないように、連続したチャンクとして num_stringsxMAX_STRING_LENGTH配列を割り当てます。char

strcpy(strings[i], "This is a test");
printf("%s\n", strings[j]);

など。完了したら、あとはfree(strings);.

この方法の主な欠点は、num_stringsが非常に大きい場合に要求を満たすのに十分なメモリがない可能性があることと、ほとんどの文字列が MAX_STRING_LENGTH より短い場合に内部で断片化が発生することです。

于 2012-07-24T18:39:50.107 に答える
1
char **strings;

strings=(char **) malloc(number of strings);

strings[i]=(char *) malloc(MAX_STRING_LENGTH);
于 2012-07-24T17:55:15.857 に答える
1

それが本当に動的である場合、それは次のようなものである必要があるかもしれません:

char **strings = malloc( sizeof(char*) * numstrings );
for ( int i = 0; i < numstrings; i++ )  
    strings[i] = malloc( MAX_STRING_LENGTH );

すべてを1つのチャンクに割り当てて(解放しやすくする)、配列内の個々のポインターを、割り当てられたバッファー内の計算された位置に割り当てることもできます。ただし、これにより、メリットを超えない複雑さが追加されます。

于 2012-07-24T17:55:48.757 に答える