【发布时间】:2016-08-12 05:17:40
【问题描述】:
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的内存位置。可能很傻。我用谷歌搜索了很多,但没有找到明确的答案。
【问题讨论】:
-
可能是新创建的帧在同一个内存上。也就是说,这实际上是在引发未定义的行为,因此无法确定。
-
您可能会发现this answer 很有用。
-
在对
func()的两次调用之间添加printf("Just for kicks - %d\n", 37);并查看行为如何变化。另请注意,输出行应以换行符结尾;开头的换行符是可选的,只有在需要双倍行距时才需要。在您输出换行符之前,您的输出可能不会出现 - 有时这可能会产生误导。 -
这显然是
C代码,因为malloc需要在 C++ 中进行强制转换。