Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230162
  • 博文数量: 108
  • 博客积分: 3092
  • 博客等级: 中校
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 16:35
文章分类

全部博文(108)

文章存档

2011年(3)

2010年(43)

2009年(19)

2008年(43)

我的朋友

分类: C/C++

2008-12-15 22:49:34

编程时发现这样一个现象
char str1[]="abcd";
char str2[]="efgh";
*str1=*str2;
这个操作是合法的,结果也是正确的;

但是如果用字符串指针声明:
char *str1="abcd";
char *str2="efgh";
*str1=*str2;
运行时会出现内存错误
 
在CU上发帖求助,终于知道原因了,看来懂一点编译原理,深刻理解数据存储的位置还是很重要的。
 
3x to Godbach
his answer:
 
QUOTE:
今天在编程时发现这样一个现象
char str1[]="abcd";
char str2[]="efgh";
*str1=*str2;
这个操作是合法的,结果也是正确的;

这两个字符串都是保存在栈上,可以修改其中的内容。其中,*str1=*str2相当于把str2字符串的第一个字符'e'赋给了str1的第一个字符,因此,str1就变成了"ebcd"

QUOTE:
但是如果用字符串指针声明:
char *str1="abcd";
char *str2="efgh";
*str1=*str2;
运行时会出现内存错误

以上两个字符串都是存在于静态内存区域(const char *型)。对于该区域可以进行读操作,但是赋值的行为是不确定的。也就是成功与否未定义,不同的编译器可能结果不一样。
所以,不要进行这样的操作,因为你不知道这样操作的确定性结果。
阅读(1001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~