【问题标题】:initialization of arrays while operating with mallocs使用 malloc 操作时初始化数组
【发布时间】:2020-07-23 10:46:42
【问题描述】:

鉴于下面这段代码,我不明白为什么我们已经在堆栈中创建了足够的空间,为什么还要初始化矩阵的每一行。

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

main() {
    int **w;
    int i, j;
    int m, n;
    printf("Number of rows in the matrix: ");
    scanf("%d", &m);
    printf("Number of columns in the matrix: ");
    scanf("%d", &n);
    w = (int **)malloc(m * n * sizeof(int));
    
    for (i = 0; i < m; i++)
        w[i] = (int *)malloc(n * sizeof(int));
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++) {
            printf("Element [%d][%d]: ", i + 1, j + 1);
            scanf("%d", &w[i][j]);
        }
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            printf("Element [%d][%d]: %d\n", i + 1, j + 1, w[i][j]);
}

【问题讨论】:

    标签: arrays malloc


    【解决方案1】:

    你的代码有很多问题:

    • 空间不是分配在栈上,而是从堆上分配的。

    • 在这两种情况下,为对象分配的内存都是未初始化的,这意味着它没有被初始化为任何特定的东西,并且可以具有任何值。依赖任何特定内容都是未定义的行为。

    • 矩阵维度和所有矩阵元素都是从带有scanf() 的标准输入中读取的。然而,您不会检查 scanf() 是否无法从从 stdin 读取的字符转换整数,因此任何无效或丢失的输入都会在程序中的某个点导致未定义的行为。

    • 您的矩阵实际上是一个指向int 数组的指针数组,这很好,但与用于分配第一个数组的大小参数不一致:w = (int **)malloc(m * n * sizeof(int)); 应该是

        w = malloc(m * sizeof(*w));
      
    • 您可以通过使用calloc() 而不是malloc() 轻松地将对象预初始化为0:

        for (i = 0; i < m; i++)
            w[i] = calloc(n, sizeof(int));
      
    • 您还应该检查malloc() 故障并退出并显示适当的诊断消息。

    • main()main 函数的过时原型。您应该使用int main()int main(void)int main(int argc, char *argv[])...

    这是修改后的版本:

    #include <stdio.h>
    #include <stdlib.h>
    
    int get_int(void) {
        int n;
        if (scanf("%d", &n) != 1) {
            printf("invalid input\n");
            exit(EXIT_FAILURE);
        }
        return n;
    }
    
    void xalloc(size_t size) {
        void *p = calloc(size, 1);
        if (p == NULL) {
            printf("out of memory for %zu bytes\n", size);
            exit(EXIT_FAILURE);
        }
        return p;
    }
    
    int main() {
        int **w;
        int i, j;
        int m, n;
        printf("Number of rows in the matrix: ");
        m = get_int();
        printf("Number of columns in the matrix: ");
        n = get_int();
    
        w = xalloc(m * sizeof(*w));
        for (i = 0; i < m; i++) {
            w[i] = xalloc(n * sizeof(int));
        }
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                printf("Element [%d][%d]: ", i + 1, j + 1);
                w[i][j] = get_int();
            }
        }
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                printf("Element [%d][%d]: %d\n", i + 1, j + 1, w[i][j]);
            }
        }
        for (i = 0; i < m; i++) {
            free(w[i]);
        }
        free(w);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多