首页 > 解决方案 > 在函数内重新分配和操作二维数组

问题描述

我正在尝试重新分配 2D 数组的两个元素,并在同一函数中操作 2D 数组中的值。但我似乎无法让它工作。在编译代码时不会显示任何错误,但在运行时它只会打印我initial_size在函数开头指定的行main数。

所以看起来内部realloc工作正常,因为它总是在启动后打印一整行。但是外部realloc不起作用,因为它只会打印几行。

getchar()注意:实际代码从/获取未知大小的输入scanf()。这就是为什么realloc函数在函数的循环内。

该函数的简化版本,省略了错误处理:

void func(int ***A) {
    int i, j;
    int len = 2;
    int len2 = 2;
    
    for (i = 0; i < 10; i++) {
        // Check to see if a realloc is needed.
        if (i >= len) {
            len *= 2;
            int **tmp = realloc(*A, len * sizeof(int*));
            *A = tmp;
            printf("Len1 = %d\n", len);
        }
        len2 = 2;
    
        for (j = 0; j < 20; j++) {
            // Check to see if a realloc is needed.
            if (j >= len2) {
                len2 *= 2;
                int *new_row = realloc((*A)[i], len2 * sizeof(int));
    
                (*A)[i] = new_row;
            }
            // Assign value.
            (*A)[i][j] = i * j;
        }
    }
}

int main() {
    int i, j;
    int initial_size = 2;
    int **A;
 
    // Malloc with a starting size of 2 (could be any size).
    A = malloc(initial_size * sizeof(int*));
    for (i = 0; i < initial_size; i++) {
        A[i] = malloc(initial_size * sizeof(int));
    }

    // Call function.
    func(&A);

    // Print the results, row by row.
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 20; j++) {
            printf("%d, ", A[i][j]);
        }
        printf("\n");
    }
    return 0;
}

我已经被困了一段时间,所以非常感谢任何帮助:)

标签: arrayscmultidimensional-arraymallocrealloc

解决方案


当您realloc在外循环中时,您将指针的数量从两个(在 中创建的main)增加到四个。

两个指针的值main被复制到新的内存区域。

两个新指针的值是不确定的,这就是你的问题。您永远不会通过分配内存来初始化它们 - 但是您在另一个循环中使用它们。

此外,您似乎是realloc单独的内部数组维度,但您只跟踪一个长度(即len2)。这也是一个问题。

并且len2 = 2循环之间的线是错误的,因为您丢失了有关先前分配的内存的信息。


推荐阅读