在做编译原理作业的时候遇到的问题。
原题6.17
在C程序中出现了段错误(Segment Fault),问原因。代码如下:
char c1[] = "good!";
char *c2 = "good!";
int main()
{
c1[0] = 'G';
printf("c1 = %s\n", c1);
c2[0] = 'G';
printf("c2 = %s\n", c2);
return 0;
}
开始天真的以为是因为指针指向的字符串不能用[]
表示偏移,后来去复习了一下C语言秒打脸hhhhh
依据课本知识点和大佬们总结的经验,找到了答案:
原帖:https://blog.youkuaiyun.com/u013812502/article/details/81196367
原因是:用字符数组表示字符串,和指针来表示字符串它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,而以指针形式表示的字符串却存储在常量区。**全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。**一句话概括:数组形字符串存放在全局数据区或栈区,可读可写。指针字符串存放在常量区,只读不能写。
以上。