执行c Pointer(总是)以有效的地址内存开始



c指针(始终)以有效的地址内存开头吗?例如,如果我有以下代码:

int *p;
*p = 5;
printf("%i",*p); //shows 5

为什么这件代码可以工作?根据书籍(我读过),他们说指针总是需要有效的地址内存,并给出以下类似的例子:

int *p;
int v = 5;  
p = &v;
printf("%i",*p); //shows 5

c指针(总是)以有效的地址内存开头?

no。

为什么此代码工作?

代码调用未定义的行为。如果它似乎使用您的特定编译器选项对您的特定系统工作,那只是一个巧合。

no。非传统的局部变量具有不确定的值,并在评估的表达式中使用它们。

行为不确定。c编译器可以可以优化指针访问范围,请注意,在 fact 中不使用p,仅使用对象*p,然后用q替换*p,并有效地生成该程序对应于此源代码:

#include <stdio.h>
int main(void) {
    int q = 5;
    printf("%i", q); //shows 5
}

当我用GCC 7.3.0和-O3 Switch编译程序时,就是这种情况。如果我在没有优化的情况下对em>进行编译,我会崩溃。这两个程序都是对代码的标准配合的解释,也就是说,将执行有效对象指向的指针指出 undfined行为 <<<<。/p>

no。

在较旧的时间内,通常将指针指向选定的内存地址(例如链接到硬件)。

char *start_memory buffer = (char *)0xffffb000;

编译器无法找到这是否是有效的地址。这涉及演员,所以这是作弊。

考虑

static int *p;

p将具有NULL的值,该值没有指向有效的地址(Linux,但在内核上,它无效,其他OS可以使用&NULL上的内存存储一些数据。

,但您也可以创建初始化的变量,因此使用未定义的初始值(这可能是错误的)。

最新更新