0

Cで文字列の配列を宣言して初期化するために、次のことを行っていました。

char *myTable[] = {
   "ABC",  "Y", "*",  "*",
   "WXYZ", "Y", "*",  "*",
   "MNO",  "Y", "*",  "*",
   NULL,   NULL,NULL, NULL
};

NULL は内部使用のためのものです。

gcc 4.4.6 に移行したため、次の警告が表示されます。

abc.cpp:74: warning: deprecated conversion from string constant to ‘char*’

私の配列を初期化する正しい方法は何ですか?

4

4 に答える 4

4

これは、これらの文字列リテラルの constness を削除しようとしており、これらの定数文字列リテラルが格納されているメモリを変更しようとすると未定義の動作が発生するため、コンパイラが十分に注意して警告するためです[1]。

配列を次のように宣言しますconst char *myTable[]


[1]: C99 標準: 6.7.8 初期化 §32 :

宣言は、''pointer to '' 型でchar *p = "abc";定義し、要素が文字列リテラルで初期化される長さ 4 の ' 'array of '' 型のオブジェクトを指すように初期化します。を使用して配列の内容を変更しようとした場合の動作は未定義です。pcharcharp

于 2013-02-15T14:01:18.277 に答える
1

const char *の代わりに使用してみてくださいchar*

于 2013-02-15T13:58:46.540 に答える
1

文字列リテラルは定数であるため、 を使用する必要がありますconst char *myTable[]

于 2013-02-15T13:59:37.367 に答える
1

「hello world」のような文字列は不変の文字列定数です。宣言する必要があります

const char *myTable[] = {
   "ABC",  "Y", "*",  "*",
   "WXYZ", "Y", "*",  "*",
   "MNO",  "Y", "*",  "*",
   NULL,   NULL,NULL, NULL
}; 
于 2013-02-15T14:02:12.983 に答える