所以我知道发生了seg错误,但我无法确定其背后的内部逻辑。 我相信这是因为在访问指针之前初始化指针失败。 但是在记忆方面,什么会触发这一点。
前代码:
#include<stdio.h>
int main(void)
{
memset((char *)0x0, 1, 100); //What causes this to seg fault
printf("HELLO POFTUT.COM n");
return ;
}
还有可能的解决方案。 谢谢。
解决方案是不要写入任意内存位置:-(
更详细地说,C11 标准规定了*
间接寻址运算符:
一元
*
运算符表示间接寻址。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是指定该对象的左值。如果操作数的类型为"指向类型的指针",则结果的类型为"type"。如果为指针分配了无效值,则一元运算符*
的行为是未定义的。
该段提及脚注102,其中指出:
一元
*
运算符取消引用指针的无效值包括null 指针、与所指向的对象类型不恰当对齐的地址以及对象生存期结束后的地址。
请注意,这不是一个详尽的列表,如果您使用0x01
而不是等效NULL
0x00
,您可能仍然会遇到麻烦。除非您知道您的实现允许访问(例如内存映射 I/O 地址(,否则您实际上应该只写入您知道存在某种描述的 C 对象的地址。