用于对字符串文字char * p =" abcd"执行++ *(p ++)的C运行时错误(未定义行为)

时间:2014-07-06 10:33:50

标签: c pointers

问题1:

int main()
{
  char *p="abcd";
  printf("%c",*(p++));
  return 0;
}  // Here it will print a

问题2:

int main()
{
  char *p="abcd";
  printf("%c",++*(p++));//why it is showing error over here
  return 0;
} // Here it shows runtime error.

有人可以向我解释为什么语句++ *(p ++)会导致运行时错误。

3 个答案:

答案 0 :(得分:5)

char *p="abcd";

"abcd"是字符串文字,字符串文字在C中是不可修改的。尝试修改字符串文字会调用未定义的行为。

使用由字符串文字初始化的可修改数组来修复您的问题:

char p[] ="abcd";

答案 1 :(得分:2)

字符串文字是只读的。任何修改它的尝试都会调用未定义的行为 在第二个代码中,您正在修改字符串文字,这会导致程序的未定义行为

答案 2 :(得分:1)

++*(p++) - 这相当于++*p;p++;

因此,存储在变量p中的地址的第一个字节值(字符)将增加1。然后变量p的值将增加,这意味着p将指向(存储)字符串文字("abcd")的第二个字符的地址。

现在通过以下两个变量声明。

char *p = "abcdef"; 
char p1[] = "abcdef"
  • 这里对于第一个变量p,将在堆栈中分配4个字节 存储字符串文字"abcdef"的地址,然后是6字节 被分配以将字符串文字("abcdef")存储在进程内存的文本段中。始终文本段是只读的。所以这个值无法修改。

  • 然后对于第二个变量,6个字节将在堆栈本身中分配给 存储字符串("abcdef")。进程内存中的堆栈段都有 读写访问。

执行++*p(修改地址中的值)适用于变量p1,但不适用于变量p