我正在处理我在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。
答案 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
缓冲区溢出等函数。