段错误(Segment Fault)

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

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

Python本身并不直接提供捕获类似于C/C++中Segmentation Fault段错误)异常的功能,因为这种错误通常是由于底层内存访问违规引起的,并不是由解释型语言如Python正常处理的部分。 但是,在某些特定场景下你可以采取间接的方式应对这种情况: ### 使用`faulthandler` 对于调试目的来说,可以利用`faulthandler`模块帮助你当程序遇到致命信号时打印出Python的追踪信息。这有助于开发者了解发生崩溃的具体位置。 ```python import faulthandler # 启用将跟踪回溯写入标准错误faulthandler.enable() def some_function(): # 模拟可能会导致崩溃的操作... pass some_function() ``` 一旦启用了`faulthandler`,如果您的应用程序因接收到SIGSEGV等信号而终止,则会自动输出当前线程正在执行的代码的位置和其他有用的信息。 ### C扩展库保护机制 如果你是在编写嵌入了Python的C或Cython扩展模块并且担心其中可能出现段错误的话,那么可以在关键部分添加适当的检查并尝试优雅地恢复或记录日志而不是让整个进程立即退出。 此外还可以考虑使用像Valgrind这样的工具来检测和预防潜在的问题,尤其是在开发阶段。 需要注意的是,理想情况下应该尽量避免写出可能导致segment fault的应用逻辑;同时也要意识到并非所有类型的低级硬件/操作系统级别的故障都可以通过高层脚本语言层面有效地“捕捉”。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值