3
char sXSongBuffer[20][30];
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"};

これがエラーを返すのはなぜexpected expression before ‘{’ tokenですか? このように配列を初期化する理由は、後で次のように内容を変更できるようにするためです。

sXSongBuffer = {"New Song", "More Music From Me"};
4

4 に答える 4

7

C では配列に代入できません。C では、コンパイル時の定数である値を使用して配列を初期化できます。後で値を変更する場合、またはコンパイル時の定数ではない値を設定する場合は、配列の特定のインデックスに手動で割り当てる必要があります。

そのため、への代入sXSongBufferは C では許可されていません。さらに、sXSongBuffer[0]tosXSongBuffer[19]も配列であるため、次のように言うことさえできません。sXSongBuffer[0] = "New Song";

あなたが望むものに応じて、これはあなたのために働くかもしれません:

/* declare sXSongBuffer as an array of pointers */
char *sXSongBuffer[30] = {
    "Thriller",
    "Don't Stop Till You Get Enough",
    "Billy Jean",
    NULL /* set the rest of the elements to NULL */
};
size_t i;
/* and then later in your code */
sXSongBuffer[0] = "New Song";
sXSongBuffer[1] = "More Music From Me";
for (i=2; i < sizeof sXSongBuffer; ++i)
    sXSongBuffer[i] = NULL;

ただし、上記は、コンパイル時にすべての文字列がわかっている場合にのみ機能します。そうでない場合は、「十分な大きさ」の配列が必要かどうか、または文字列および/または文字列の数に動的メモリが必要かどうかを決定する必要があります。どちらの場合も、strcpy()文字列をコピーするために同等のものを使用する必要があります。

編集:コメントに返信するには:

最初の 3 つの要素が文字列のサイズのバッファーを指している 30 の char ポインターの配列を宣言していsXSongBuffer[0]ます 。 . また、アレイ内の残りのスロットのそれぞれについてメモリを確保する必要があります。彼は、OP + 指定された init のような 2d char 配列を使用するか、実行時に各バッファーを使用して値をコピーする必要があります。彼はまた、彼の記憶を思い出す必要があります。"Thriller"sXSongBuffer[0] = malloc(32);mallocmallocfreemalloc

sXSongBufferinchar *sXSongBuffer[30];はサイズ 30 の配列で、各要素はchar *へのポインタcharです。私がする時:

char *sXSongBuffer[30];

これらの 30 個のポインターはそれぞれ初期化されていません。私がする時:

char *sXSongBuffer[30] = { "Thriller", ... };

ポインターを別の読み取り専用の場所に設定しました。ポインターを別の場所に「再ポイント」することを妨げるものは何もありません。それはまるで私が持っていたかのようです:

char *data = "Hello";
printf("%s\n", data);
data = "Hello, world";
printf("%s\n", data);

上記のスニペットでは、最初に割り当てdataてから"Hello"、後でより長い文字列を指すように変更しています。上記の回答のコードは、sXSongBuffer[i]後で別のものに再割り当てするだけsXSongBuffer[i]で、ポインターであるため、割り当ては問題ありません。特にsXSongBuffer[0]は でありchar *、 が含まれる有効な場所を指すことができますchar

回答の後半で述べたように、コンパイル時に文字列が不明な場合、このスキームは機能せず、「十分な大きさ」のサイズの配列を使用するか、十分な大きさのメモリを動的に割り当てる必要があります。

于 2010-02-16T10:25:04.417 に答える
0

Designated Initializersを見てください。

#include <stdio.h>

int main (void) {

    char a[6][6] = { [2] = "foo", [4] = "bar" };

    for (int i=0; i<6; ++i)
        printf("%d == %s\n", i, a[i]);

    return 0;
}

これは c99 の機能です。コンパイル:

gcc -W -std=c99 2dInit.c -o 2dInit

これは以下を出力します:

0 == 
1 == 
2 == foo
3 == 
4 == bar
5 == 

あなたの場合、あなたがしたい:

char sXSongBuffer[20][30] = { 
    [0] = "Thriller", 
    [1] = "Don't Stop Till You Get Enough", 
    [2] = "Billy Jean"
};
于 2010-02-16T11:02:02.257 に答える