有人能解释一下这里的分段错误吗?

时间:2016-03-23 00:48:09

标签: c

我编写了一段代码来读取文本文件foo.txt,格式为:

1
2
3
4

它存储最后一个数字并递增它并将其写回。这是我存储最后一个数字的部分,代码的下一部分是将数字写入文件。该文件由./readfile 100 foo.txt调用,其中100是必须递增最后一个数字的次数。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    char ch[100];
    int i = 0;
    int j = 0;
    int count = atoi(argv[1]);

    while (count != 0) {
        fp = fopen(argv[2], "r");
        while (fp) {
            ch[i] = fgetc(fp);
            i++;
            j = i;
            printf("%d", j);    
        }
        fclose(fp);
        count--;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

你的问题是:

while (fp)

对于布尔测试,FILE*只是另一个指针。因此,只要它成功打开,该测试总是通过。你一直在读取字符,存储到数组的连续元素中,直到你溢出,最终完全写入未分配的内存(或巧合地重写一些重要的东西并以其他方式导致崩溃)。

你真的想要这样的东西:

    // Must read into int; EOF itself is not a char value
    int inchar;
    // Read and test for EOF
    while((inchar = fgetc(fp)) != EOF)
    {
        ch[i] = inchar;  // Store
        i++;
        printf("%d", inchar); // Print raw value returned by fgetc
    }

答案 1 :(得分:1)

修复&#34; while(fp)&#34;问题。你仍然有ch [i]的问题。使用您的代码,&#34;我&#34;将增加到400.因此发生分段错误。

    while(fp)
    {
        ch[i] = fgetc(fp);
        i++;
        j = i;
        printf("%d", j);    
    }