第二次通话后,Realloc失败

时间:2018-04-29 14:00:36

标签: c malloc realloc

我正在尝试读取要排序的单词列表,我从一个相当小的数组(10个元素)开始,然后如果当前容量不是,则希望将数组的大小增加10足够。这似乎适用于第一个realloc,但我在尝试再次调用realloc时得到一个SIGABRT。我确信这是一件我看不到的简单事情,但我似乎无法弄明白。这是我的计划:

int main(int argc, char *argv[]){
    char *string = malloc(100);
    // Array of pointers starting with 100 elements
    char **toSort = malloc(100*sizeof(char *));
    if(toSort == NULL) {
        exit(1);
    }

    for(int i = 0; i < 100; i++) {
        // Each string can be up to 100 characters long
        toSort[i] = malloc(101);
        if(toSort[i] == NULL) {
            exit(1);
        }
    }

    // Get all lines in the file
    int counter = 0;
    int max = 10;
    char *toAdd;


    FILE *txt = fopen("wlist0.txt", "r");


    while(fgets ( string, 100, txt ) && counter < max) {;

        toAdd = malloc(100);
        if(toAdd == NULL) {
            exit(1);
        }
        strcpy(toAdd, string);

        toSort[counter] = string;
        counter++;

         //if the array needs to be enlarged
        if(counter == max) {
            char **new = realloc(toSort, (max+10) * sizeof(char));
            if(new == NULL) {
                exit(1);
            }
            for(int i = max; i < max + 10; i++) {
                toSort[i] = malloc(101);
                if(toSort[i] == NULL) {
                    exit(1);
                }
            }
            toSort = new;
            max += 10;
        }
    };

    for(int i = 0; i < max; i++) {
        char *word = toSort[i];
        printf("%s", word);
    }

    for(int i = 0; i < max; i++) {
       free(toSort[i]);
    }

    free(toSort);


    return 0;
};

就像我的评论所说,我的字符串最大长度为100个字符。我想我也可以为字符串动态分配内存,但是当我让其他realloc工作时我会担心。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

此代码在toSort释放/修改其指向的内存之后将值分配给realloc()

     //if the array needs to be enlarged
    if(counter == max) {
        char **new = realloc(toSort, (max+10) * sizeof(char));
        if(new == NULL) {
            exit(1);
        }
        for(int i = max; i < max + 10; i++) {
            toSort[i] = malloc(101);  <--- toSort is invalid here
            if(toSort[i] == NULL) {
                exit(1);
            }
        }
        toSort = new;
        max += 10;
    }

这会更好用:

     //if the array needs to be enlarged
    if(counter == max) {
        char **new = realloc(toSort, (max+10) * sizeof( *new )); <-- fixed here, too
        if(new == NULL) {
            exit(1);
        }
        toSort = new;
        for(int i = max; i < max + 10; i++) {
            toSort[i] = malloc(101);
            if(toSort[i] == NULL) {
                exit(1);
            }
        }
        max += 10;
    }

您的代码中可能存在其他错误。我还没有完全检查过它。