首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >浮雕:1码的无效读数(strtok,atoi)

浮雕:1码的无效读数(strtok,atoi)
EN

Stack Overflow用户
提问于 2020-03-29 22:41:36
回答 1查看 300关注 0票数 0

我对valgrind有个问题:这是我的程序(错误出现的主要部分):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
    }
}

当我跑步时,上面写着:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

我不知道这个节目怎么了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 00:57:10

必须延迟释放内存,直到不再使用该内存为止。这包括对strtok的调用和返回的令牌。

您可以尝试一些链接这个(没有测试)的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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值的返回值,以避免未定义的行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60925279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文