int main()
{
char *arr="hello";
clrscr();
printf("%s",arr);
arr="";
printf("and %s",arr+2);
getch();
return 0;
}!
このコードの出力:-
hello と nd %s
ここで確認してください:-
http://ideone.com/TJzUvp
// ポインター文字列でのこの異常な動作はなぜですか?
int main()
{
char *arr="hello";
clrscr();
printf("%s",arr);
arr="";
printf("and %s",arr+2);
getch();
return 0;
}!
このコードの出力:-
hello と nd %s
ここで確認してください:-
http://ideone.com/TJzUvp
// ポインター文字列でのこの異常な動作はなぜですか?
未定義の動作を呼び出しています。
arr+2
設定後の参照arr=""
は、メモリの任意の部分 (この場合は、文字列リテラルの 1 つ) を取得することです。
プログラムを実行すると、定数文字列and %s
が定数の空の文字列の直後に来るようにメモリが配置されます。メモリは次のようになります。
. . . \0 a n d ' ' % s \0 . . .
空の文字列を に代入すると、その文字a
がa
ポイントになり\0
ます。次に、a+2 を計算すると、結果はその文字を指しn
ます。
したがって、a+2 を NUL で終わる文字列として解釈すると、 が得られますnd %s
。
もちろん、これは未定義の動作です。多くのコンパイラは、使用する順序になるように定数をレイアウトします。ここでは、空の文字列が の前に来and %s
ます。しかし、コンパイラがそうするように強制するものは何もありません。メモリを別の方法でレイアウトすると、別の結果が得られます。プログラムがクラッシュすることさえあります。
文字列へのポインターを作成していません>..グローバル変数と定数用のメモリ空間にブロックを作成し、そのブロックを指すポインターを使用しました.. CONSTANT メモリ空間の一部...あなたがしているのは、ポインタを別のメモリ位置に再割り当てし、幸運にも目的の場所を指すことを期待していることです..常に起こるとは限りません