2012-04-06 68 views

回答

3

所以我的问题是,因为myVar是一个局部变量,它应该在函数返回后消失吗?

是的。它会指向您设置的地址。然而,该地区是该地区的功能。假定在它指出超出范围之后它不属于你。

这是不正确的:

uint8_t* p = (uint8_t*)malloc(count); 
free(p); 
p[0] = 1; 

但您或您的工具来诊断,因为该区域将在堆栈上存在(除非优化掉的)困难得多错误。

而且不应该指向它的指针也是空指针?

编号C和C++不管理你。

0

ptr *处的地址将保持分配状态,如果再次调用函数,它将更改指针。至少这是我的理论。出于性能原因,C++不会覆盖您的指针。

int foo(int val) { 
    int myVar = val; 
    int* ptr = &myVar; 
    return ptr; 
} 

int main() 
{ 
    int *ptr = foo(4); 
    foo(3); 
    printf("val= %d", *ptr); //will print 3 
    return 0; 
} 
+0

哈!现在你提到再次调用该函数。我刚做了一个小实验,另一个问题突然出现了!:D所以我刚刚修改我的代码有点像这样 'code int main() { printf(“* bar =%d \ n”,foo()); printf(“* bar2 =%d \ n”,foo()); 系统(“暂停”); return 0; } ' bar和bar2具有相同的值! :O – 0x56794E 2012-04-06 02:47:26

+0

这是正确的,每个声明的变量将被分配一个常量内存位置。该位置在整个程序执行过程中不会改变。但是,正如user966379所提到的那样,它不保证是所有示波器的唯一位置。 – 2012-04-06 10:06:40

0

含有保持INT MYVAR和属于该功能的任何其它局部变量是未分配的时刻的函数返回的地址的存储器,但有在C中没有清除过程,所以在存储器中的值将在return和printf之间的那一小段时间保持不变。

C中的未分配(或释放,同样的事情)内存就像是在Windows中删除一个文件,其中文件内容暂时仍在驱动器上,但是在任何时候该区域被再次需要覆盖其他。你仍然可以阅读内容,但你不应该相信你阅读的内容。

2

在你的情况下,printf("val= %d", *foo())正在打印垃圾值。由于没有其他代码,该数据未被更改。

运行这段代码,你会得到的想法

int* foo() 
    { 
     int myVar = 4; 
     int* ptr = &myVar; 
     return ptr; 
    } 

    int* foo1() 
    { 
     int myVar = 5; 
     int* ptr = &myVar; 
     return ptr; 
    } 
    int main() 
    { 
     int* x = foo(); 
     int* x1 = foo1(); 
     printf("val= %d", *x); 
     return 0; 
    }