26
int main(void) {
    char testStr[50] = "Hello, world!";
    char revS[50] = testStr;
}

エラーが表示されます:「無効な初期化子」の行にrevS. 私は何を間違っていますか?

4

6 に答える 6

34

その方法で初期化することはできません..revSの右側に非常に具体的なものが必要です=. からC11 6.7.9 Initialization /14, /16:

14/ 文字型の配列は、文字列リテラルまたは UTF-8 文字列リテラルで初期化することができ、オプションで中括弧で囲みます。

文字列リテラルの連続するバイト (空きがある場合、または配列のサイズが不明な場合は、終端の null 文字を含む) は、配列の要素を初期化します。

: : :

16/それ以外の場合、集合体または共用体型を持つオブジェクトの初期化子は、要素または名前付きメンバーの初期化子の中括弧で囲まれたリストでなければなりません。


同じ結果を得るには、コードを次のように置き換えることができます。

int main (void) {
    char testStr[50] = "Hello, world!";
    char revS[50]; strcpy (revS, testStr);
    // more code here
}

これは技術的には初期化ではありませんが、同じ機能的な結果を達成します。本当に初期化が必要な場合は、次のようなものを使用できます

#define HWSTR "Hello, world!"
int main (void) {
    char testStr[50] = HWSTR;
    char revS[50] = HWSTR;
    // more code here
}
于 2012-06-15T00:55:21.000 に答える
9

配列は割り当てられません。

memcpy を使用して内容をコピーする必要がありtestStrますrevS

memcpy(revS,testStr,50);
于 2012-06-15T00:55:40.397 に答える
4

の初期化のように、定数式のみを使用して配列を初期化できますtestStr

定数式ではないrevS別の配列変数で初期化しようとしています。最初の文字列の内容を 2 番目の文字列にコピーする場合は、.strcpy

于 2012-06-15T00:55:46.677 に答える
3

a の初期化子はchar[]、リテラル文字列または のようなものである必要があります{1,2,3,4}。別の変数の名前にすることはできません。

于 2012-06-15T00:55:03.030 に答える