【问题标题】:Segmentation fault using arrays使用数组的分段错误
【发布时间】:2011-05-18 22:43:53
【问题描述】:

嗯,我一直在做这件事,我确切地知道问题出在哪里,但不知道如何解决它。我已经知道 fgets 和 scanf 对于这个程序会更好,但我不能那样做。

该程序大约在 10 分钟前运行,然后我对其进行了更改,但出现了 seg 错误。然后我把它改回来,仍然有一个段错误。无论如何,我相信新鲜的眼睛会马上看到它。试试看:D

PS:请注意我的(小于)而不是

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

【问题讨论】:

  • 我没有看到你初始化过你的 char *line[MAXLINE];
  • 高亮你的代码并点击 CTRL+K 或者高亮它并点击101图标
  • 哦。如果我是一个优秀的程序员,我会怎么做?
  • @SiegeX - 我可以在它周围放两个(无论波浪号键上的其他东西的名称是什么)吗? &lt; 显然是这样!
  • 顺便说一句,你打电话给printf("\n%s\n", line[n])。请注意,line[n] 是一个没有空终止符的字符,\0。这将打印一个垃圾值流。

标签: c arrays pointers segmentation-fault


【解决方案1】:

你正在做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 &lt; WORDLENGTH; ++i) if ((tmp[i] = getchar()) == ' ') break; 后跟..

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

【讨论】:

  • 我们赢了!非常感谢。
  • :)。但严重的是,在循环内部更新循环变量往往会在以后更新循环时产生错误。
【解决方案2】:

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

  1. malloc() 可能失败并返回 NULL 指针
  2. 在for()的末尾,最大i值为WORDLENGTH

所以这个赋值不正确(超出范围)

    tmp[i]= 0;

可以同时修复

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

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

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2017-08-06
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多