int main ()
{
char *arr= "abt"; // This could be OK on some compilers ... and give an access violation on others
arr++;
*arr='e'; // This is where I guess the problem is occurring.
cout<<arr[0];
system("pause");
}
対照的に:
int main ()
{
char arr[80]= "abt"; // This will work
char *p = arr;
p++; // Increments to 2nd element of "arr"
*(++p)='c'; // now spells "abc"
cout << "arr=" << arr << ",p=" << p << "\n"; // OUTPUT: arr=abc,p=c
return 0;
}
このリンクと図は「理由」を説明しています。
http://www.geeksforgeeks.org/archives/14268
Cプログラムのメモリレイアウト
Cプログラムの典型的なメモリ表現は、次のセクションで構成されています。
- テキストセグメント
- 初期化されたデータセグメント
- 初期化されていないデータセグメント
- スタック
- ヒープ
また、const char * string = "hello world"のようなCステートメントは、文字列リテラル "hello world"を初期化された読み取り専用領域に格納し、文字ポインター変数文字列を初期化された読み取り/書き込み領域に格納します。