fgets 的分段错误

问题描述 投票:0回答:2

我已经调试了这个问题,但无法弄清楚为什么我的 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;
    } 

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

c segmentation-fault fgets
2个回答
1
投票

我还没有完成整个代码,但是

*array = malloc(0 * sizeof(*array))
这里这个
malloc
调用不会分配任何内存。


1
投票

除了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
指针返回或无法读取或写入的分配。

© www.soinside.com 2019 - 2024. All rights reserved.