我对valgrind有个问题:这是我的程序(错误出现的主要部分):
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
free(linea);
linea = NULL;
while (!strcmp(token, "c")) {
linea = readline(file);
token = strtok(linea, " ");
free(linea);
linea = NULL;
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
}
当我跑步时,上面写着:
Invalid read of size 1
at 0x4905E72: strtok_r (strtok_r.c:49)
Address 0x4a42b12 is 2 bytes inside a block of size 128 free'd
我不知道这个节目怎么了。
发布于 2020-03-30 08:57:10
必须延迟释放内存,直到不再使用该内存为止。这包括对strtok
的调用和返回的令牌。
您可以尝试一些链接这个(没有测试)的东西:
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
while (!strcmp(token, "c")) {
free(linea);
linea = readline(file);
token = strtok(linea, " ");
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
free(linea);
}
注意:这段代码不包括对返回值的任何检查,就像它演示了如何从问题中修改代码一样。
在输入strtok
或其他函数之前,应检查NULL
值的返回值,以避免未定义的行为。
https://stackoverflow.com/questions/60925279
复制相似问题