编程时发现这样一个现象
char str1[]="abcd";
char str2[]="efgh";
*str1=*str2;
这个操作是合法的,结果也是正确的;
但是如果用字符串指针声明:
char *str1="abcd";
char *str2="efgh";
*str1=*str2;
运行时会出现内存错误
在CU上发帖求助,终于知道原因了,看来懂一点编译原理,深刻理解数据存储的位置还是很重要的。
3x to Godbach
his answer:
今天在编程时发现这样一个现象
char str1[]="abcd";
char str2[]="efgh";
*str1=*str2;
这个操作是合法的,结果也是正确的;
这两个字符串都是保存在栈上,可以修改其中的内容。其中,*str1=*str2相当于把str2字符串的第一个字符'e'赋给了str1的第一个字符,因此,str1就变成了"ebcd"
但是如果用字符串指针声明:
char *str1="abcd";
char *str2="efgh";
*str1=*str2;
运行时会出现内存错误
以上两个字符串都是存在于静态内存区域(const char *型)。对于该区域可以进行读操作,但是赋值的行为是不确定的。也就是成功与否未定义,不同的编译器可能结果不一样。
所以,不要进行这样的操作,因为你不知道这样操作的确定性结果。
阅读(1026) | 评论(0) | 转发(0) |