为什么下面的代码行导致我的程序出错?

Hoa*_*Hoa 0 c

在以下代码中:

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[]) {

    char input[20];
    fgets(input, sizeof(input), stdin);
    char * pch;
    pch = strtok(input, " ");
    int i = 0;
    int nums[3];
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok(NULL, " ");
        //nums[i] = atoi(pch);
        i++;
    }


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入

1 2 3
Run Code Online (Sandbox Code Playgroud)

得到:

1
2
3
Run Code Online (Sandbox Code Playgroud)

当我取消注释注释行时,我得到:

1
2
3

Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

为什么这一行导致seg错误?

Jon*_*Jon 5

最重要的是你需要atoi(pch) strtok再次呼叫之前运行:

printf ("%s\n",pch);
nums[i++] = atoi(pch);
pch = strtok(NULL, " ");
Run Code Online (Sandbox Code Playgroud)

否则最后一次调用atoi将空指针作为参数传递并atoi崩溃.

感兴趣的另一个细节是最后input可能包含换行符.这不会是一个问题atoi,但它会导致你的循环迭代4次并在结束后写nums.虽然它很可能不会导致程序崩溃,但这仍然是未定义的行为,您应该插入数组边界检查以防止它.