c - 是什么导致这个 memset() 中的分段错误?
问题描述
所以我知道发生了段错误,但我无法确定其背后的内部逻辑。我相信这是因为在访问指针之前初始化指针失败。但是在内存方面会触发这种情况。
前代码:
#include<stdio.h>
int main(void)
{
memset((char *)0x0, 1, 100); //What causes this to seg fault
printf("HELLO POFTUT.COM \n");
return ;
}
还有什么可能是解决这个问题的方法。谢谢你。
解决方案
解决方案是不要写入任意内存位置:-)
更详细地说,C11 标准规定了*
间接运算符:
一元运算
*
符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值。如果操作数的类型为“pointer to type”,则结果的类型为“type”。如果为指针分配了无效值,则一元运算符的行为*
未定义。
该段引用脚注 102,其中指出:
*
一元运算符取消引用指针的无效值包括空指针、与指向的对象类型不适当对齐的地址以及对象在其生命周期结束后的地址。
请注意,这不是一个详尽的列表,如果您使用0x01
而不是NULL
-equivalent ,您可能仍然会遇到麻烦0x00
。除非您知道您的实现允许访问(例如内存映射的 I/O 地址),否则您实际上应该只写入您知道存在某种描述的 C 对象的地址。
推荐阅读
- maven - Maven部署两次
- r - 使用.data.table 观察到的去年(半年、月)的平均值
- postgresql - 在 postgresql 中旋转大表
- php - 如何允许 php(apache 作为 www-data 用户)执行命令?
- python - python pandas rolling apply自定义函数返回keyError
- jquery - 部分 ID id 在带有 jquery 替换功能的文本中可见
- c# - 水晶报表 mvc
- excel - 为什么我的雅虎财务网址不适用于 querytables.add 来自网络的连接
- php - 在 WooCommerce 中按运输区域设置最低和最高运费成本
- python - 如果我有一个四显示器显示器,如何将应用程序移动到 python 中的某些显示器?