使用数组进行分段错误

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)

lij*_*jie 6

你正在做的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填充的内存块.