int t_parse(char* target, FILE* fp)
{
char cuts = ':';
char * tok;
char ln[BUFF_SIZE];
if (lnCnt == 0)
{
lnCnt = 1;
}
while (!feof(fp))
{
int i = 0;
int hop = 1;
char c;
while (hop)
{
c = fgetc(fp);
if (feof(fp))
{
if (i == 0)
{
return 0;
}
ln[i] = '\0';
hop = 0;
}
else if (c == '\n')
{
ln[i] = '\0';
hop = 0;
}
else if (i == BUFF_SIZE)
{
fprintf(stderr, "%i: Error of long line\n", lnCnt);
exit(1);
}
if (hop)
{
ln[i] = c;
}
i++;
}
if (ln[0] != '#' && ln[0] != '\t' && ln[0] != '\0')
{
tok = strtok(ln, &cuts);
if (tok == NULL)
{
fprintf(stderr, "%d: Error of invalid target\n", lnCnt);
exit(1);
}
else
{
strcpy(target, tok);
for (int j = 0; j < BUFF_SIZE; j++)
{
if (target[j] == ' ')
{
target[j] = '\0';
return lnCnt++;
}
}
return lnCnt++;
}
}
lnCnt++;
}
return 0;
}
运行Valgrind后,条件跳转或移动取决于未初始化的值 == 2469 ==在0x10938F:t_parse(text_parsing.c:81)
哪个是 其他 { strcpy(target,tok);
for (int j = 0; j < BUFF_SIZE; j++)
{
if (target[j] == ' ')
{
target[j] = '\0';
return lnCnt++;
}
第81行是if(target [j] =='') 我在这里检查,所以我不确定为什么会有内存泄漏? 我运行了命令valgrind --leak-check = yes --track-origins = yes --read-var-info = yes 537make
答案 0 :(得分:0)
valgrind没有透露任何有关泄漏的信息。它展示了它的另一个功能。它检测到您正在测试未初始化的内存的内容。这意味着target
包含未定义的数据。如果您想获得更详细的答案,则必须说明如何设置target
答案 1 :(得分:0)
tok
是字符串复制到target
中。它将以“ \ 0”字符终止。
然后,您将遍历target
中的字符,并将终止于匹配的空格字符。但是,如果找不到空格字符(未初始化并且可能包含任何内容),则您将移至target
中字符串的结尾,因此valgrind会警告您。
另一个问题:char *strtok(char *str, const char *delim);
在此,delim指向一串定界符,而不是单个字符。因此char cuts = ':';
应该是char *cuts = ":";