试图释放分配的内存会产生堆错误

时间:2013-12-02 00:48:34

标签: c malloc free heap-corruption

我正在处理我在c中写的代码中的奇怪错误。 这是发生错误的地方:

    char* firstChar = (char*) malloc(ONE_CHAR_STRING);
if (!firstChar) {
    *result = MTM_OUT_OF_MEMORY;
    return false;
}
if (command != NULL) {
    strcpy(firstChar, command);
    firstChar[1] = '\0';
}
free(firstChar);

'command'是一个字符串,ONE_CHAR_STRING在程序中定义,(ONE_CHAR_STRING = 2)。 程序进入“免费”功能时出现的错误是:

warning: Heap block at 00731528 modified at 00731532 past requested size of 2

这个错误奇怪地只附加在我的PC / eclipse上。当我在linux中运行代码时,它不会提示此错误并且工作(特定部分)很好。 可能是什么原因?

关于内存错误的另一个问题,我的程序(没有这部分)可能在windows上工作得很好,但是在Linux中他们的内存分配是一个问题? 我不能在这里写下代码因为它太长了(并且gdb没有给出错误发生的地方)...问题是关于可能性以及可能是什么原因。

谢谢,Almog。

2 个答案:

答案 0 :(得分:0)

你可以使用另一个字符串复制函数来避免溢出:

strncpy(firstChar,command,ONE_CHAR_STRING);

答案 1 :(得分:0)

如果strcpy字符串长度大于firstChar,则

command可能会重叠以复制ONE_CHAR_STRING,或者因为空终止而导致您出现奇怪行为。您可以通过分配command

安全地将firstChar字符串复制到firstChar[0] = command[0]; firstChar[1] = '\0'

如果Linux和Windows的编译器都是gcc(Windows中的MinGW),请使用-fstack-protector作为编译器参数来帮助您调试strcpy缓冲区溢出等函数。