来自fgets的分段错误

时间:2014-11-02 04:58:02

标签: c segmentation-fault fgets

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

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

2 个答案:

答案 0 :(得分:1)

没有通过整个代码。但*array = malloc(0 * sizeof(*array))此处此malloc调用不会分配任何内存。

答案 1 :(得分: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,这是不正常的(但不是闻所未闻)来自或写入。