尝试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时,前一个地址在内存中,我认为它是有效的,但它是免费的() - 编辑。 感谢所有的建议!答案 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采用单独的参数,因此更难以出错。