无法解除引用

时间:2012-07-01 23:09:11

标签: c++

在以下代码中,为什么无法执行此解除引用:*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。

2 个答案:

答案 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程序的典型内存表示包括以下内容   部分。

     
      
  1. 文字段
  2.   
  3. 初始化数据段
  4.   
  5. 未初始化的数据段
  6.   
  7. 堆栈
  8.   
  9.         

    像const char * string =“hello world”这样的C语句使得   字符串文字“hello world”存储在初始化的只读中   area和初始化的字符指针变量字符串   读写区。