在以下代码中,为什么无法执行此解除引用:*arr = 'e'
。输出不应该是字符'e'
吗?
int main ()
{
char *arr = "abt";
arr++;
* arr='e'; // This is where I guess the problem is occurring.
cout << arr[0];
system("pause");
}
我收到以下错误:
Arrays.exe中0x00a91da1处的未处理异常:0xC0000005:访问冲突写入位置0x00a97839。
答案 0 :(得分:3)
"abt"
是所谓的字符串文字常量,任何修改它的尝试都会导致未定义的行为*arr='e';
。
答案 1 :(得分:0)
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”存储在初始化的只读中 area和初始化的字符指针变量字符串 读写区。