奇怪的字符串赋值问题
int main()
{
char *p ="hello";
char *q ="ABC";
*q = *p;
printf("%s",q);
return 0;
}
编译正常但运行后return exit(-1) 出错
但这段代码可以正常运行
char *p ="hello";
char q[3] ="ABC";
q[0] = *p;
printf("%s",q);
本人c语言环境是fedora gcc编译,在我记忆中,*p=*q没错阿,*p不是字符类型吗
[解决办法]
变量p,q存在静态存储区的,里面的内容对于很多编译器都是不允许修改的,声明改成这样char p[] ="hello"; char q[] ="ABC";应该就不会出错了。
[解决办法]
char *p ="hello";
char *q ="ABC";
这样定义的变量p和q,它们只是两个字符型的指针,保存在栈上。它们指向的字符串叫做“字符串字面量”,存放在静态区,是受到保护的,若对其进行修改,程序会出错。
*q = *p; 这一句就是要对受保护的地址进行修改。
char q[4] ="ABC"; 这样定义,在栈上定义了一个数组,有3个字符型元素。这个数组中的内容是在栈上的,可以更改,所以运行*q = *p就正确。