我首先使用 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/