首页 > 解决方案 > 取消引用指向任意地址的指针会导致分段错误

问题描述

我为指针编写了一个简单的 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 的值?我不应该能够读取该地址的字节吗?

标签: cpointersundefined-behaviordereference

解决方案


除非您在具有特定已知内存位置的嵌入式系统上运行,否则您不能将任意值分配给期望能够成功取消引用它的指针。

C 标准的第 6.5.3.2p4 节就间接运算符规定了以下内容*

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

正如上面段落中提到的,C 标准只允许指针指向已知对象或动态分配的内存(或NULL),而不是任意内存位置。某些实现可能在特定情况下允许这样做,但一般情况下不允许这样做。


推荐阅读