易犯的错误:C指针指向内存空间的常量区

来源:互联网 发布:曲靖医专教务网络 编辑:程序博客网 时间:2024/06/17 22:52

根据下面语句写出结果:

char* s = “AAA”;printf(“%s”, s);s[0] = 'B';printf(“%s”, s);



看到上面的短程序,或许我们会觉得显而易见,这里指针s指向了AAA,存放的是AAA的地址,所以第一个打印的结果为AAA,s[0]代表的是指向字符串AAA的首地址,所以会觉得第二个打印的结果就是BAA,即将第一个字符更改为了B。

然而在将上面的程序进行验证时,编译执行后发现只有第一个打印正确,接着是出现“段错误”!

这是因为指针虽然指向了AAA,但是AAA为字符串,存放在内存空间中的常量区(数据段的rodata段)。解释到这里我们就可以很容易的明白段错误的原因。对于常量的值是不可修改的,这也是非常容易因为不去考虑其存储空间而犯的错误。在此引以为戒,避免再次犯这样的错误!

0 0