use*_*179 0 c arrays pointers segmentation-fault
好吧,我一直在这里,我确切地知道故障的位置,但不知道如何解决它.我已经知道fgets和scanf对于这个程序会更好,但我做不到.
该程序大约10分钟前工作,然后我改变了它并得到了一个段故障.然后我把它改回去了,仍然有一个段错误.无论如何,我确信新鲜的眼睛会马上看到它.有它:D
PS:请注意我的(lessthan)而不是<因为我不知道如何在我的代码示例中正确地留下那些:(
#define WORDLENGTH 15
#define MAXLINE 1000
int main()
{
char *line[MAXLINE];
int i = 0;
int j;
int n;
char c;
for (n=0; c!=EOF; n++){
char *tmp = (char *) malloc(sizeof(char)*WORDLENGTH);
while ((c=getchar())!=' ')
tmp[i++]=c;
line[n]=tmp;
i=0;
printf("\n%s\n",line[n]); //
}
for(j = 0; j < n; j++){
printf("\n%s\n", line[j]);
free (line[j]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你正在做的line[n++] = tmp.之后访问line[n].但line[n]尚未分配.
要改变它,你可以打印line[n-1],但更清楚的是:
line[n] = tmp;
i = 0;
printf(... line[n]);
Run Code Online (Sandbox Code Playgroud)
并将增量放在for语句中,即for (n = 0; c != EOF; n++).
编辑
这是我要做的总结:
将i=0赋值放在循环的开头.从逻辑上讲,它是初始化的,i并且目前在两个地方完成(在int i = 0;分配时和之后line[n]).这两个地方都不在人们期望while循环中使用的变量初始化的地方.
通过检查i不超过来防止无意义输入WORDLENGTH-1.实际上,我可能会将内部while循环编码为for循环,我喜欢这样:
for (i = 0; i < WORDLENGTH; i++) {
tmp[i] = getchar();
if (tmp[i] == ' ') break;
}
tmp[i] = 0;
Run Code Online (Sandbox Code Playgroud)
或者(在我的性格中)for(i = 0; i < WORDLENGTH; ++i) if ((tmp[i] = getchar()) == ' ') break;接着是......
tmp[i] = 0到NUL-终止字符串.因为malloc不一定返回0填充的内存块.