strtok在C中的局部变量上

时间:2013-05-14 16:02:01

标签: c strtok

我在C中遇到一个有趣的问题,当从main调用一个外部方法时,尝试strtok一个通过引用传递给它的本地(主)字符串。如果我在main中strtok字符串,它按预期工作,但如果我调用外部方法,它会失败并出现segfault。 Valgrind在访问strtok结果的第一个元素时的输出:

Address 0xfffffffffeffebc0 is not stack'd, malloc'd or (recently) free'd

--- test.c ---

extern void tt(char* x);

main(argc, argv) 
    int argc;
    char *argv[];
{
    char line[5000];
    // if I uncomment the following two lines and comment above it works as expected
    // char * line;
    // line = malloc(5000);
    strcpy(line, "hello world");
    printf("%d\n", sizeof(line));
    tt(line);
}

--- test2.c ---

void tt(char* l) {
    char* x = strtok(l, " \t");
    printf("%p\n", x);
    printf("%c\n", x[0]);
}

编译
gcc -c test2.c -o test2.o
gcc test.c test2.o

恕我直言,它应该打印出类似的东西:

./a.out
0x.....
h

但是我在打印“h”时遇到了段错误。

有人可以解释一下这种行为吗?

感谢。

1 个答案:

答案 0 :(得分:7)

在文件

--- test2.c ---

void tt(char* l) {
    char* x = strtok(l, " \t");
    printf("%p\n", x);
    printf("%c\n", x[0]);
}

您尚未包含string.h,因此编译器假定int的返回类型为strtok。这样一行

char *x = strtok(l, " \t");

没有为x分配正确的指针(正如valgrind输出所示,你的指针至少是64位,但int很可能只有32位)。然后取消引用损坏的指针会导致分段错误。