问题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 ++)会导致运行时错误。
答案 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
。