在以下代码中:

#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;
}

输入
1 2 3

给予:
1
2
3

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

Segmentation fault: 11

为什么这一条线路会导致seg故障?

最佳答案

最主要的是,在再次调用atoi(pch)之前需要运行strtok

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

否则,对atoi的最后一次调用将空指针作为参数传入,并导致atoi崩溃。
另一个有趣的细节是input结尾可能包含换行符。这对atoi来说不是问题,但它会导致循环重复4次,并在nums结束后写入。尽管很可能不会导致程序崩溃,但这仍然是未定义的行为,您应该插入数组边界检查以防止它。

关于c - 为什么以下代码行导致我的程序出现段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16708280/

10-11 23:11