使用尚未分配的地址是合法的吗?

时间:2014-04-13 17:37:59

标签: c

我不太了解内存分配实际上是如何工作的,但这会带来什么问题:

int main(){
    int a=1;
    int *p = &a;
    p++;
    *p = 2;
    printf("%d", *p);

    return 0;  

}

4 个答案:

答案 0 :(得分:3)

通常,它会产生未定义的行为,通常会导致内存访问冲突。

但是,在您的示例中,它可能正常工作,因为变量p可能位于堆栈中的变量a之后(受到您正在使用的编译器的影响),因此通过递增值变量p你基本上把它设置为指向它自己。

现在,如果sizeof(p) == sizeof(*p),即if sizeof(int*) == sizeof(int),恰好是许多编译器(两者都等于4)的情况,那么当你将值写入{{ {1}},您要将pp设置为该值。

请注意,任何后续尝试将值写入*p指向的地址的行为都等同于将值写入程序的内存空间中的地址2,这次最有可能导致内存访问冲突。

答案 1 :(得分:1)

即可。使用未分配的内存位置进行读取或写入是不合法的。它调用未定义的行为

答案 2 :(得分:1)

您正在覆盖自己未分配的内存。这推断出未定义的行为,根据定义,这种行为并不好,因此不合法"。

答案 3 :(得分:0)

永远不要试图访问未被自己定义/分配的内存,因为这会导致某些不可预测的内容。 这不会产生语法错误,但可以生成运行时错误。 因此,在访问仅由您分配的内存之前,请务必确保。