[堆栈变量的C返回地址= NULL?

问题描述 投票:0回答:2

在C中,当您返回指向其局部变量(在堆栈上)的指针时,调用函数将返回null。

我想了解更多有关这种情况的内部信息。

我们可以在C语言中执行类似的操作

void A() {
    int A = 5;
}

void B() {
    // B will be 5 even when uninitialised due to the B stack frame using
    // the old memory layout of A
    int B;
    printf("%d\n", B);
}

int main() {
    A();
    B();
}

由于堆栈帧存储器未重置,并且B在堆栈中覆盖了A的存储器记录,因此]

但是我们不能做

int* C() {
    int C = 10;
    return &C;
}

int main() {
    // D will be null ?
    int* D = C();
}

我知道我们不应该执行此代码,并且当我们下次调用另一个函数时,它会变得很混乱,但是我想知道为什么它返回null,如果尝试访问该内存地址,为什么会出现分段错误,仍然存在吗?如果我理解正确,A,B和C的地址将完全相同。是编译器执行此操作,还是我们不能通过堆栈指针访问内存?

在C中,当您返回指向其局部变量(在堆栈上)的指针时,调用函数将返回null。我想了解更多有关内部情况的信息。我们...

c assembly stack undefined-behavior
2个回答
3
投票

[GCC在编译时看到UB可见,并决定仅故意返回NULL


0
投票

这是未定义的行为(UB),但是许多现代编译器在检测到返回对自动存储变量的引用时会返回NULL作为预防措施(例如,较新版本的gcc)。

© www.soinside.com 2019 - 2024. All rights reserved.