调整二维字符数组的大小会导致异常

Resizing 2D char array causes exception

我是C语言的新手,所以请原谅我的新手错误,我们都需要从某个地方开始。

我的任务是从一个大文件中获取一些行并将每一行存储在一个二维数组中,其中 li[0] 是第一行等等...

最重要的是,我不知道这个 'big text' 的大小是多少,所以我想出了下面的代码来在每次达到临界大小时调整数组的大小(有没有更简单的方法来去做?)。此外,除了将其设置得非常高之外,我找不到更好的方法来定义线宽。

下面的代码第二次调整大小时失败,此行出现异常 char **temp = realloc(lin, LINE_QUANT * sizeof(char*));

是什么导致了该异常?


#include <stdio.h>
#include <stdlib.h>
#define LINE_TAM 200

size_t PAL_QUANT = 100, LINE_QUANT = 3;

int main(){
    int i = 0;
    char **li = (char**) malloc(LINE_QUANT * sizeof(char*));
    char fname[30];
    FILE *arq = NULL;

    // alloc word container
    for (i=0; i < LINE_QUANT; i++)
        li[i] = malloc(LINE_TAM * sizeof(char));

    if(li == NULL) return 0;

    //(ommited file opener)

    i = 0;

    //getting words from file (unknown size)
    while(fgets(li[i], LINE_TAM, arq) != NULL){
        while(i >= LINE_QUANT - 1) resizeArr(li);
        i++;
    }


return 1;
}

void resizeArr(char **lin){
    int i;
    LINE_QUANT = LINE_QUANT * 2;
    char **temp = realloc(lin, LINE_QUANT * sizeof(char*));
    if(temp) {
        lin = temp;
        for (i = LINE_QUANT/2; i < LINE_QUANT; i++){
            lin[i] = malloc(LINE_TAM * sizeof(char*));
            if (lin[i] == NULL)
                exit(1);
        }
    }
    else
        exit(1);

    free(temp);
}

由于数组的每个元素大小相同,因此可以使用指向数组的指针,(*li)[LINE_TAM]
因为resizeArr修改了指针,所以需要将指向指针的指针传递给函数或者函数需要return指针。
realloc 将处理所有需要的 free,所以不要释放指针。
这使用 stdin 但可以修改为使用 FILE*.
输入 stop 退出循环。

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

#define LINE_TAM 200

void resizeArr ( size_t *line_quant, char (**lin)[LINE_TAM]);

int main(){
    int i = 0;
    char (*li)[LINE_TAM] = NULL;//pointer to array
    size_t Line_Quant = 3;

    // alloc word container
    if ( NULL == ( li = malloc( sizeof *li * Line_Quant))) {
        fprintf ( stderr, "malloc problem\n");
        return 1;
    }

    i = 0;

    //getting words from file (unknown size)
    while ( fgets ( li[i], LINE_TAM, stdin) != NULL) {
        if ( 0 == strcmp ( li[i], "stop\n")) {
            break;
        }
        if (i >= Line_Quant - 1) {
            resizeArr ( &Line_Quant, &li);
        }
        i++;
    }

    free ( li);

    return 1;
}

void resizeArr ( size_t *line_quant, char (**lin)[LINE_TAM]) {
    int i;
    char (*temp)[LINE_TAM] = realloc ( *lin, sizeof **lin * *line_quant * 2);
    if ( temp) {//success
        *lin = temp;//assign back to caller
        *line_quant *= 2;//increase by two
        for ( i = *line_quant / 2; i < *line_quant; i++) {
            (*lin)[i][0] = 0;
        }
    }
    else {
        fprintf ( stderr, "realloc problem\n");
    }
}