c - strtok() 在 C99 中返回错误值?

标签 c pointers valgrind c99

我首先使用 std c99 在 32 位 Linux 系统上运行。所以我有这个代码

char* tokPtr = strtok(expr, " ");
    while(tokPtr != NULL) {
            tokPtr = strtok(NULL, " ");
            puts(tokPtr);
            push(tokens, tokPtr);
    }

expr 是作为参数传入的 C 字符串,类似于“1 2 +”。我只是将 put 用于测试目的。然而,当我使用 --leak-check=full 标志运行 valgrind 时,它会在 put 中为 strlen 提供大小为 1 的无效读取,并以段错误结束。当我使 tokPtr = "1";并注释掉 strtok() 的内容,我运行 valgrind 并且完全没有错误。我不知道为什么会发生这种情况,我真的需要一些帮助。谢谢。

最佳答案

这里:

while(tokPtr != NULL) {
    tokPtr = strtok(NULL, " ");
    puts(tokPtr);

您应该在调用 strtok() 之后检查是否 tokPtr == NULL,而不是之前。当 strtok() 最终返回 NULL 时(最终会如此),您将始终将 NULL 传递给 puts() 使用这段代码,这给你带来了问题。

您可以重新排序,然后更改为:

char* tokPtr = strtok(expr, " ");
while(tokPtr != NULL) {
    puts(tokPtr);
    push(tokens, tokPtr);
    tokPtr = strtok(NULL, " ");
}

还请记住,strtok() 修改它所使用的字符串并返回指向该字符串的内部指针。您没有显示您的 push() 函数,但除非代码非常简单,并且您的 expr 数组总是比堆栈更持久,否则您很可能会遇到问题将这些指针推到它上面。最好为每个 token 分配一些内存,并将 strtok() 返回的内容复制到其中,然后推送这些内存。

关于c - strtok() 在 C99 中返回错误值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36439498/

相关文章:

c - 基本for循环的误区(C)

c - 为什么我们对对象使用指针而不是直接使用对象值?

c - 解决由 valgrind 检查的内存问题

c - 如何修复 malloc() 的控制台返回 : memory corruption (fast)

ios - 函数 '_strnicmp' 的隐式声明在 C99 中无效

c - 错误: null parameter when calling GRBloadmodel

c - 未按预期收到段错误

c - 如何将二维数组传递到 C 中大小未知的函数中?

C 免费() : invalid pointer

size - valgrind - 无效的写入大小