内存的奇怪问题

最近遇到了一个奇怪的问题,经过化简得代码表示如下:

#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,它是在堆上进行分配内存的。

参考:

  1. https://zhuanlan.zhihu.com/p/449165315
  2. https://cloud.tencent.com/developer/article/1729074

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注