在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。我想了解更多有关内部情况的信息。我们...
[GCC在编译时看到UB可见,并决定仅故意返回NULL
。
这是未定义的行为(UB),但是许多现代编译器在检测到返回对自动存储变量的引用时会返回NULL作为预防措施(例如,较新版本的gcc)。