Cygwin malloc覆盖堆中的另一个内存

时间:2011-10-05 09:02:17

标签: c cygwin malloc

尝试malloc内存时遇到一个奇怪的错误。我有一个指向结构的指针,它是“malloced”,我想要另一个结构。所以我再次调用malloc并且malloc返回的指针指向一个空的空间 - 到目前为止它还可以。然后我memset分配的区域和memset覆盖另一个仍在使用的变量。 内存中的第一个结构位于0x1643c98,第二个结构指向第二个结构是0x1643bf8,但我想要malloc 200字节。代码:

data_t *data = get_head_data(); 
int length = data->head.length;
data_t *new_data = malloc(length); 
memset(new_data, 0x00, length); // this line override the perivously malloced data 
//some other operation

我使用窗口xp(32位)和cygwin,使用gcc 3.4.4。处理器是intel core 2 duo。 任何想法是错的或应该是什么问题? 提前谢谢。

编辑:对不起我是一个完全错误的曲目。有一个错误的功能,无人值守意外。当我稍后调用malloc时,前一个地址在内存中,我认为它是有效的,但它是免费的() - 编辑。 感谢所有的建议!

2 个答案:

答案 0 :(得分:1)

如果需要将新分配的内存设置为0 - 请使用calloc。您可能会混淆指针,大小和变量 - 再次检查您的代码。

答案 1 :(得分:1)

data_t *new_data = malloc(length);

除非sizeof(data_t)为1,否则该行可能是错误。您正在分配length个字节。如果你想要一个length data_t的数组,那么你需要分配sizeof(data_t)*length个字节。

更好的解决方案是使用calloc,正如@littleadv建议的那样。该函数为number_of_items和sizeof_item采用单独的参数,因此更难以出错。