【问题标题】:Segmentation fault from fgets来自 fget 的分段错误
【发布时间】:2014-11-02 04:58:01
【问题描述】:

我已经对此进行了调试,但无法弄清楚为什么我的 fgets 无法正常工作。在我更改代码以动态调整数组大小之前,fgets 运行良好。由于我是 C 初学者,这个问题困扰了我很长时间。

这是错误代码:

int readNumbers(int **array, char* fname, int hexFlag) {
    int numberRead = 0;
    FILE* fp;
    int counter = 0;
    char arr[100];
    char* ptr;
    size_t curSize = 16;
    int radix = hexFlag ? 16 : 10;

    *array = malloc(0 * sizeof(*array));

    fp = fopen(fname, "r");  

    if (fp == NULL) {
            printf("Error opening file\n");
            return -1;
    }

    while (fgets(arr, sizeof(arr), fp)) { //Seg faults here when it reaches end of file.
            ptr = strtok(arr, " \n");
            while(ptr) {
                if (counter >= curSize) {
                     curSize += 16;
                     array = realloc(*array, curSize * sizeof(**array));
                }
                (*array)[counter++] = strtol(ptr, NULL, radix);
                ++numberRead;
                ptr = strtok(NULL , " \n");
            }

    }
    if (ferror(fp)) {
            fclose(fp);
            return -1;
    }

这是改变数组大小之前的工作代码:

int readNumbers(int array[], char* fname, int hexFlag) {
    int numberRead = 0;
    FILE* fp;
    int counter = 0;
    char arr[100];
    char* ptr;

    fp = fopen(fname, "r");  

    if (fp == NULL) {
            printf("Error opening file\n");
            return -1;
    }

    while (fgets(arr, sizeof(arr), fp)) {
            ptr = strtok(arr, " \n");
            while(ptr) {
               if (hexFlag == 0) { 
                    array[counter++] = strtol(ptr , NULL , 10);
               } else {
                    array[counter++] = strtol(ptr, NULL, 16);
               }
               ++numberRead;
               ptr = strtok(NULL , " \n");
            }

    }
    if (ferror(fp)) {
            fclose(fp);
            return -1;
    } 

到达文件末尾时,新添加的更改段错误。我强烈怀疑这与双指针有关。任何帮助都非常感谢!

【问题讨论】:

  • 你认为它会起作用吗..? *array = malloc(0 * sizeof(*array));
  • @AmitSharma 啊!我明白了,这解决了它!但我不明白这将如何导致 fgets 仅在文件末尾而不是立即出现段错误。

标签: c segmentation-fault fgets


【解决方案1】:

没有遍历整个代码。但是*array = malloc(0 * sizeof(*array)) 这里这个malloc 调用不会分配任何内存。

【讨论】:

    【解决方案2】:

    除了 Amit Sharma 指出的问题:

    您最初使用以下方式分配动态数组:

    *array = malloc(0 * sizeof(*array));
    

    当你存储到动态数组中时,你使用:

    (*array)[counter++] = strtol(ptr, NULL, radix);
    

    但是,您随后的重新分配使用:

    array = realloc(*array, curSize * sizeof(**array));
    

    应该是:

    *array = realloc(*array, curSize * sizeof(*array));
    

    请注意,使用 malloc(0) 是可以的(不寻常,但并非闻所未闻),只要您的代码准备好处理 NULL 指针返回或无法读取或写入的分配.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-29
      • 2013-01-03
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      相关资源
      最近更新 更多