段错误(Segment Fault)

探讨了在C语言中,使用字符数组和指针表示的字符串在内存中存储区域的不同,以及由此导致的可写性差异。字符数组存储在全局数据区或栈区,可读可写;而指针字符串存储在常量区,只读不可写。修改指针字符串会导致Segment Fault错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做编译原理作业的时候遇到的问题。
原题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
原因是:用字符数组表示字符串,和指针来表示字符串它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,而以指针形式表示的字符串却存储在常量区。**全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。**一句话概括:数组形字符串存放在全局数据区或栈区,可读可写。指针字符串存放在常量区,只读不能写。
以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值