【问题标题】:Building a function using Dynamic memory allocation使用动态内存分配构建函数
【发布时间】:2021-11-29 12:45:13
【问题描述】:
#include <stdio.h>
#include <stdlib.h> 

void addition(int column, int row) {
    int **array_a = (int **)malloc(sizeof(int*) * column);
    int **array_b = (int **)malloc(sizeof(int*) * column);
    int **array_c = (int **)malloc(sizeof(int*) * column);

    for (int i = 0; i < column; i++) {
        array_a[i] = (int *)malloc(sizeof(int) * row);
    }

    for (int i = 0; i < column; i++) {
        for (int k = 0; k < row; k++) {
            array_a[i][k] = rand();
        }

        for (int i = 0; i < column;) {
            array_b[i] = (int *)malloc(sizeof(int) * row);
        }

        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                array_b[i][k] = rand();
            }
        }

        for (int i = 0; i < column;) {
            array_c[i] = (int *)malloc(sizeof(int) * row);
        }

        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                array_c[i][k] = array_a[i][k] + array_b[i][k];
            }
        }

        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                printf("%d ", array_c[i][k]);
            }

            free(array_a);
            free(array_b);
            free(array_c);
        }
    }
}

int main(void) {
    int column, row;
    scanf("%d" "%d", &column, &row);
    addition(column, row);

    return 0;
}

我正在构建一个函数,它创建两个 2D 数组并用随机数填充值并组合它们的值。 没有错误,但 printf 不起作用。有什么办法让它工作吗? 我不知道如何解释更详细,但如果你问我,我会回答。

【问题讨论】:

  • “printf 不工作”相当含糊,请尝试更具描述性。你的代码肯定有问题,但你应该得到一些打印出来的东西。如果你使用随机数,你怎么知道会发生什么?
  • 你有一个 for (int i = 0; i &lt; column;) { 循环分配所有可用内存,因为你忘记了 i ++。另外,这个 for 循环嵌套在 for (int i = 0; i &lt; column; i++) { 中,这意味着您可能在某处忘记了结束 }

标签: c multidimensional-array memory-management


【解决方案1】:

您的代码中存在多个问题:

  • 循环未正确嵌套:第二个 for (int i = 0; i &lt; column; i++) 循环的主体应在嵌套的 for for (int k = 0; k &lt; row; k++) 循环之后立即停止。

  • 在某些循环中缺少i++ 增量:for (int i = 0; i &lt; column;) 应该是

    for (int i = 0; i < column; i++)
    

    这是主要问题,因为它会导致无限循环,使用新分配的块反复初始化 array_b[0],直到内存耗尽或超出。

  • 你没有检查内存分配失败。

  • 您的使用或columnsrows 很奇怪:2D 中的第一个索引通常是指行,第二个是指列,但由于您的用法是一致的,因此可能不是问题。

  • 您不会在每个 rowcolumn 之后输出换行符:所有输出都在一行中生成,没有尾随换行符。这可能会导致您的输出不会出现在某些系统上。您可能希望在输出后暂停程序以让用户看到输出。

  • 在 C 中不需要转换 malloc() 的返回值。

  • 你没有释放子数组。

这是修改后的版本:

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

int **allocate_array(int column, int row) {
    int **array = malloc(sizeof(array[0]) * column);

    if (array == NULL)
        return NULL;
    for (int i = 0; i < column; i++) {
        array_a[i] = malloc(sizeof(array[i][0]) * row);
        if (array_a[i] == NULL) {
            while (i-- > 0) {
                free(array[i]);
            }
            free(array);
            return NULL;
        }
    }
    return array;
}

void free_array(int **array, int column, int row) {
    if (array) {
        for (int i = 0; i < column; i++) {
            free(array[i]);
        }
        free(array);
    }
}

void addition(int column, int row) {
    int **array_a = allocate_array(column, row);
    int **array_b = allocate_array(column, row);
    int **array_c = allocate_array(column, row);

    if (array_a && array_b && array_c) {

        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                array_a[i][k] = rand();
            }
        }
    
        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                array_b[i][k] = rand();
            }
        }
    
        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                array_c[i][k] = array_a[i][k] + array_b[i][k];
            }
        }
    
        for (int i = 0; i < column; i++) {
            for (int k = 0; k < row; k++) {
                printf("%d ", array_c[i][k]);
            }
            printf("\n");
        }
    }
    free_array(array_a, column, row);
    free_array(array_b, column, row);
    free_array(array_c, column, row);
}

int main(void) {
    int column, row;
    if (scanf("%d%d", &column, &row) == 2 && column > 0 && row > 0)
        addition(column, row);

    return 0;
}

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 2020-05-25
    • 2013-11-10
    • 2016-04-10
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多