最近遇到了一个奇怪的问题,经过化简得代码表示如下:
#include "stdafx.h"
#include <malloc.h>
void foo2() {
int *Handle;
Handle = (int *)alloca(100);
memset(Handle, 0x11, 100);
return;
}
void foo1(int **Handle){
*Handle = (int *)alloca(100);
memset(*Handle,0xAA,100);
return;
}
int main()
{
int *Value=NULL;
foo1(&Value);
foo2();
getchar();
return 0;
}
简单的说,在 foo1() 中分配100bytes的内存空间,0然后在foo2() 中在分配100Bytes,但是实践发现,前面分配的内存空间被“冲掉”了。更具体的说:
1.运行 foo1(), 之后查看到 value 的内存地址已经赋值为 0xaa
2.接下来执行 foo2(),但是运行之后,Value 对应的内存空间被覆盖为0x11。
有兴趣的朋友可以自己先琢磨五分钟看看能否找到问题。
最终,这个问题是分配内存的 alloca()导致的:alloca分配的是栈区(stack)内存,程序自动释放;(注意,栈空间有限仅几kb左右,堆空间远大于栈空间)。当 foo1 执行完成,这个区域已经被释放;当执行 foo2 的时候,程序会再次使用这个内存【参考1】。
解决方法:改成 malloc,它是在堆上进行分配内存的。
参考:
- https://zhuanlan.zhihu.com/p/449165315
- https://cloud.tencent.com/developer/article/1729074