4

c++の文字列リテラルは の型だと思いますconst char*const char*また、オブジェクトをオブジェクトに割り当てることはできませんnon-constant char*。ただし、Visual Studio 2010 では。次のコードは、エラーや警告なしでコンパイルできますが、実行時エラーが発生します。

int main(void)
{      
    char *str2 = "this is good";
    str2[0] = 'T';
    cout << str2;
    getchar();
    return 0;
}

文字列の値を変更しない場合、値の読み取りは問題ありません。

for(char *cp = str2; *cp !=0; ++cp) {
    printf("char is %c\n", *cp);
}
getch();
return 0;

では、なぜ const char* を char* に代入できるのでしょうか?

4

3 に答える 3

5

質問は VC++ の下にありますが、GCC では意味のある警告があります。

警告: 文字列定数から 'char*' への非推奨の変換 [-Wwrite-strings]

この警告は、const/non-const の違いにもかかわらず、コンパイラが暗黙的な変換を適用することを意味します。したがって、このコードは問題ありません (実行時に変更する必要はありません)。

char *str2 = "this is good";

ただし、変更するstr2と未定義の動作が発生します。

于 2013-04-12T11:38:01.857 に答える
1

C++11 ではなく C++03 を見てみましょう。

[変換配列]

ワイド文字列リテラルではない文字列リテラル (2.13.4) は、「char へのポインタ」型の右辺値に変換できます。

実際には、ナロー文字列リテラルは「n const char の配列」型ですが、上記のように、(C++03 では既に非推奨になっている) 暗黙的に型の右辺値に変換する機能がありchar *ます。

const_castポインタが指すオブジェクトは const として宣言されているため、変更は許可されません (未定義の動作) 。

于 2013-04-12T11:56:44.987 に答える
1

実際、文字列リテラルは定数です。ただし、配列はポインターに減衰し、配列constの最初の要素への非ポインターを取得しました。

char *str2 = "this is good";

const char 配列の値を変更すると、未定義の動作が発生します。

これは、gcc 4.7.2 ではクリーンにコンパイルされません。MSVC で警告レベルを警告レベル 4 に上げると、そこでも警告が発せられる可能性があります。

于 2013-04-12T11:35:12.373 に答える