在以下代码中:
#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/