【发布时间】:2018-05-25 10:19:35
【问题描述】:
我正在为一个编程语言类开发解析器,并且在将我的表达式树转换为预排序中的字符串时遇到了内存泄漏问题。在我有它之前,在 exprToString 中为字符串分配内存时,它是 100 * sizeof(char),但是内存泄漏结果要大得多。所以,我摆脱了 100 * 但我仍然得到非 ascii 打印输出和奇怪的重复出现的“retu”......
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the null-
terminator
//free(result);
//in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
char* exprToString(Expr* ex){
char *string = (char*)malloc(sizeof(char));
//free(string);
if(strcmp(ex->value,"18killstreak") == 0){
return " ";
}
string = concat(string,ex->value);
string = concat(string,exprToString(ex->a));
string = concat(string,exprToString(ex->b));
return string;
}
这是一个示例表达式:z / ( x + 2 * x ) 这是打印输出:0etur/z +x *2 x
发生了什么事?
【问题讨论】:
-
char *string = (char*)malloc(sizeof(char));仅分配 1 个字节...并且非 nul 终止,因此进一步的strlen调用返回未定义的值,并且您正在将一个垃圾字符串与另一个添加。 -
所以我只需要在 concat 之前将 \0 附加到我的所有字符串?
-
不,那只是第一个错误。我的回答中解释了内存泄漏。
-
看看 realloc,它应该可以解决您每次返回新缓冲区并造成内存泄漏的问题。
标签: c string pointers memory-leaks concatenation