首页 > 解决方案 > C动态增长数组重新分配问题

问题描述

我想在 C 中实现动态增长的数组。我将文件中的单词读取到char ** 数组中,当数组已满时,它的大小增加了 2。但是当我重新分配内存时,数组的前两个元素是丢失的。我尝试使用 lines = realloc() 但它崩溃了。我究竟做错了什么?

测试.txt:

test1
test2
test3
test4
test5
test6
test7
test8
test9 (no end of line) 

我的输出:

─
đ%
test3
test4
test5
test6
test7
test9

代码:

#include <stdio.h>
#include <malloc.h>

int size = 8;

char **read(FILE *input, char **lines, int *lSize) {
    for (int i = 0; !feof(input); i++) {
        *lSize += 1;

        if (*lSize > size) {
            realloc(lines, (size *= 2) * sizeof(char *));
            for (int j = (*lSize) - 1; j < size; j++) {
                lines[j] = (char *) malloc(1024 * sizeof(char));
            }
        }

        fscanf(input, "%s", lines[i]);
    }

    return lines;
}

int main(){
    FILE *file = fopen("test.txt", "r");

    if (file == NULL) {
        return -1;
    }

    char **lines = malloc(size * sizeof(char *));

    for (int i = 0; i < size; ++i) {
        lines[i] = malloc(1024 * sizeof(char));
    }

    int lsize = 0;

    read(file, lines, &lsize);

    printf("lSize:%d\n", lsize);
    printf("size:%d\n", size);

    for (int i = 0; i < lsize; ++i) {
        printf("%s\n", lines[i]);
    }


    for (int i = 0; i < size; ++i) {
        free(lines[i]);
    }

    free(lines);

    return 0;
}

标签: arrayscpointersrealloc

解决方案


给定char **read(FILE *input, char **lines, int *lSize)

做什么:realloc(lines, (size *= 2) * sizeof(char *))做什么?

lines好吧,它可能通过移动它来改变指向的内存块的大小。这就是它返回一个新指针的原因。仅将新指针分配回lines(就其本身而言)不会有太大帮助,因为它只会更新lines此函数中的局部变量。

但幸运lines的是也从函数返回。但是它的返回值在 main 中被忽略了,所以在read返回之后,linesin main 可能是一个虚假的指针。主要做lines = read(file, lines, &lsize)


推荐阅读