使用数组进行分段错误

时间:2010-12-02 06:09:18

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

你正在做line[n++] = tmp。然后在此之后访问line[n]。但是尚未分配line[n]

要更改它,您可以改为打印line[n-1],但更清楚的是:

line[n] = tmp;
i = 0;
printf(... line[n]);

并将增量放在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;

或(在我的角色中)for(i = 0; i < WORDLENGTH; ++i) if ((tmp[i] = getchar()) == ' ') break;后跟..

tmp[i] = 0到NUL终止字符串。由于malloc不一定返回0填充的内存块。

答案 1 :(得分:1)

建议的解决方案中仍然存在错误!

  1. malloc()可能会失败并返回NULL指针
  2. 在for()的末尾,最大的i值是WORDLENGTH
  3. 所以这个分配不正确(超出范围)

        tmp[i]= 0;
    

    可以用

    修复
    char *tmp = (char *) malloc( sizeof(char) * (WORDLENGTH + 1) );
    if ( tmp == NULL )      // end of available memory
        break;
    

    此外,目前尚不清楚是否在最后一个字符串中允许EOF。