因此,我搞砸了动态内存和指针,我想知道当涉及指向局部变量的指针时,C如何管理堆栈。我想到了这个简单的功能:
int* dummy(){
int test = 4;
int *t2;
t2 = &test;
return t2;
}
此函数初始化一个指针,并将int作为局部变量(不应在函数外部访问,因为一旦退出函数,堆栈状态将被恢复)。但是,我将返回指针作为函数的结果。我可以找回指针并使用:
打印我的局部变量的值#include <stdio.h>
int main(void){
int* p = dummy();
// some other calls to other functions to mess up the bellow stack,
// where my local variable "test" was supposed to be landing
printf("%d\n", *p); // printing the value of "test" (which is 4)
}
为什么此打印正确的结果?指针不是从其他状态指向堆栈中的变量吗?我很困惑。
如果内存留在没有动态分配的位置,它将留在哪里?它会永远丢失吗? (无法“释放”它)
未定义的行为是未定义的。此程序可以打印的值在任何意义上都没有“正确”的含义。让您感到困惑的是,您认为该程序可以打印一些“正确”的值,因此您想知道为什么它会打印“正确”的值。
问题完全出在您对某些值比其他值更“正确”的错误理解。对于该程序,所有值都同样“正确”。