是什么导致此memset()中的分段错误?

问题描述 投票:-2回答:1

所以我知道发生段错误,但我无法查明其背后的内部逻辑。我相信这是因为在访问指针之前初始化指针失败。但是在内存方面会触发什么呢?

ex代码:

#include<stdio.h> 

int main(void) 
{ 
  memset((char *)0x0, 1, 100); //What causes this to seg fault
  printf("HELLO POFTUT.COM \n"); 
  return ; 
}

此外,这可能是解决方案。谢谢。

c segmentation-fault memset
1个回答
0
投票

解决方案是不写到任意内存位置:-)

更详细地讲,*间接操作符的C11标准状态:

一元*运算符表示间接。如果操作数指向一个函数,则结果为一个函数指示符;否则为0。如果它指向一个对象,则结果是一个指定该对象的左值。如果操作数的类型为“要键入的指针”,则结果的类型为“ type”。 如果为指针分配了无效值,则一元*运算符的行为未定义。

该段引用脚注102,其中指出:

在用于一元*运算符的指针取消引用的无效值中,有[[空指针,对于所指向的对象类型不适当对齐的地址,以及位于该对象之后的对象的地址。生命的尽头。

请注意,这不是

穷举

列表,如果您使用0x01而不是等效于NULL0x00,您可能仍然会遇到麻烦。除非您知道您的实现允许访问(例如,内存映射的I / O地址),否则您实际上只应写到知道有某种C对象的地址。
© www.soinside.com 2019 - 2024. All rights reserved.