【发布时间】:2020-05-25 08:22:17
【问题描述】:
所以我知道发生了段错误,但我无法确定其背后的内部逻辑。 我相信这是因为在访问指针之前初始化指针失败。 但是在内存方面会触发这种情况。
前代码:
#include<stdio.h>
int main(void)
{
memset((char *)0x0, 1, 100); //What causes this to seg fault
printf("HELLO POFTUT.COM \n");
return ;
}
还有什么可以解决这个问题。 谢谢。
【问题讨论】:
-
你希望这行代码做什么?你想在什么架构上运行它?地址 0-99 是否可以从系统上的用户空间写入?你从哪里复制的代码?
-
写入 NULL 指针通常会导致崩溃。这是未定义的行为。你不能指望它会起作用。通常,MMU 被告知不要映射虚拟内存的第一页,因此如果您尝试对其进行读取或写入,则会出现分段错误,因为您正在写入无效(未映射)内存。
-
定义为返回
int的函数中的return;应该会出现编译器错误。 -
'internal logic' 是您的 memset() 尝试将 100 个字节写入从地址 0 开始的地址范围。每个主要操作系统确保读取或写入地址 0 导致一个错误(默认情况下),以帮助捕获非常常见的未初始化变量错误。在内部,类 UNIX 操作系统 R/W 保护一些内存页面(Linux 通常为 4K 页面),“红色区域”,以捕获堆栈溢出,例如炸毁堆栈顶部(向低内存增长),因为与检测/查找/修复内存损坏相比,查找和修复显式运行时访问冲突(错误)要容易得多。
标签: c segmentation-fault memset