c - 取消引用指向任意地址的指针会导致分段错误
问题描述
我为指针编写了一个简单的 C 代码。根据我的理解,指针是一个变量,它保存另一个变量的地址。例如:
int x = 25; // address - 1024
int *ptr = &x;
printf("%d", *ptr); // *ptr will give value at address of x i.e, 25 at 1024 address.
但是,当我尝试下面的代码时,我遇到了分段错误
#include "stdio.h"
int main()
{
int *ptr = 25;
printf("%d", *ptr);
return 0;
}
这有什么问题?为什么指针变量不能返回地址 25 的值?我不应该能够读取该地址的字节吗?
解决方案
除非您在具有特定已知内存位置的嵌入式系统上运行,否则您不能将任意值分配给期望能够成功取消引用它的指针。
C 标准的第 6.5.3.2p4 节就间接运算符规定了以下内容*
:
一元运算
*
符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值。如果操作数的类型为“pointer to type”,则结果的类型为“type”。 如果为指针分配了无效值,则一元运算符的行为*
未定义。
正如上面段落中提到的,C 标准只允许指针指向已知对象或动态分配的内存(或NULL
),而不是任意内存位置。某些实现可能在特定情况下允许这样做,但一般情况下不允许这样做。
推荐阅读
- angular - 在具有反应式表单的 Angular 7 应用程序中,我如何修改此方法以使其仅清除表单组中的无效表单控件?
- css - 根据 body 标签类/属性在组件中应用不同的样式
- python - 如何用机械化捕捉超时
- sql - 在列中查找日期的准确性并将其复制并根据日期值的准确性分配给日期列
- sql-server - 数据库 B 和 C 中表中的所有行,只有数据库 A 中表中的唯一行
- c++ - C++ UBSAN 对派生对象产生误报
- python-3.x - 从数据框中写入多个 CSV 文件
- c# - 如何在 Jobject 中搜索节点
- python - 熊猫将唯一日期显示为重复
- java - 在输入具有最大和最小日期的情况下,Selenium 测试日期输入有问题