malloc保留函数调用之间的值

时间:2016-08-12 05:17:40

标签: c pointers

void func(){ 
     int *ptr;
     printf("\n *** %d\n",*ptr);
     ptr=malloc(sizeof(int));
     *ptr=111;
     printf("\n ##### %d\n",*ptr);
}

int main()
{
    func();
    func();
    return(0);
}

GCC输出

 *** -1991643855   // Junk value for the first call
 ##### 111         // After allocating and assigning value
 *** 111           // second call pointer the value which 111
 ##### 111         // second call after assigning

我对func()中malloc的行为感到困惑。在第一次调用之后,局部变量指针ptr在堆栈帧中被清除。在第二次调用期间,将在新的堆栈帧中再次创建ptr。所以ptr并没有指向任何地方。那么为什么在第二次调用中打印时,它指向111的内存位置。这可能非常愚蠢。我经常搜索Google,但没有找到明确的答案。

3 个答案:

答案 0 :(得分:5)

@Size(max=10) @Max(5) Integer sampleint; 在分配一些值之前会有不确定的值。取消引用具有不确定值的指针将调用ptr,这可能会产生任何结果 - 包括打印第一次调用undefined behavior时看到的垃圾值,打印func,如第二次所示致电111,甚至崩溃您的计划。

作为旁注,请在func的末尾添加free(ptr);,以便您的程序释放使用func动态分配的内存。

答案 1 :(得分:1)

这实际上是在取消未定义的行为,所以没有什么可以肯定的。访问未初始化的变量是未定义的行为。

那就是说,可能是创建的新帧在同一个内存中。

答案 2 :(得分:1)

在初始化指针之前声明指针并将其解除是未定义的行为 - 它可能包含任何内容。我相信你的指针第二次打印相同值的原因是因为func()的堆栈帧在第一次调用后弹出。然后再次调用它,导致相同的堆栈帧被推送到第一个堆栈帧。它为存储指针所提供的内存恰好与前一次调用中分配给指针的内存相同。

注意:你应该在退出函数之前释放你分配的内存,否则你会有内存泄漏。