-1
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

// ポインター文字列でのこの異常な動作はなぜですか?

4

3 に答える 3

1

未定義の動作を呼び出しています。

arr+2設定後の参照arr=""は、メモリの任意の部分 (この場合は、文字列リテラルの 1 つ) を取得することです。

于 2013-03-26T13:04:04.087 に答える
1

プログラムを実行すると、定数文字列and %sが定数の空の文字列の直後に来るようにメモリが配置されます。メモリは次のようになります。

.  .  .  \0  a  n  d  ' '  %  s \0  .  .  .

空の文字列を に代入すると、その文字aaポイントになり\0ます。次に、a+2 を計算すると、結果はその文字を指しnます。

したがって、a+2 を NUL で終わる文字列として解釈すると、 が得られますnd %s

もちろん、これは未定義の動作です。多くのコンパイラは、使用する順序になるように定数をレイアウトします。ここでは、空の文字列が の前に来and %sます。しかし、コンパイラがそうするように強制するものは何もありません。メモリを別の方法でレイアウトすると、別の結果が得られます。プログラムがクラッシュすることさえあります。

于 2013-03-26T13:08:04.107 に答える
0

文字列へのポインターを作成していません>..グローバル変数と定数用のメモリ空間にブロックを作成し、そのブロックを指すポインターを使用しました.. CONSTANT メモリ空間の一部...あなたがしているのは、ポインタを別のメモリ位置に再割り当てし、幸運にも目的の場所を指すことを期待していることです..常に起こるとは限りません

于 2013-03-26T15:11:58.487 に答える