int main(void) {
char testStr[50] = "Hello, world!";
char revS[50] = testStr;
}
エラーが表示されます:「無効な初期化子」の行にrevS
. 私は何を間違っていますか?
その方法で初期化することはできません..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
}
配列は割り当てられません。
memcpy を使用して内容をコピーする必要がありtestStr
ますrevS
memcpy(revS,testStr,50);
の初期化のように、定数式のみを使用して配列を初期化できますtestStr
。
定数式ではないrevS
別の配列変数で初期化しようとしています。最初の文字列の内容を 2 番目の文字列にコピーする場合は、.strcpy
a の初期化子はchar[]
、リテラル文字列または のようなものである必要があります{1,2,3,4}
。別の変数の名前にすることはできません。