【问题标题】:How does this program create a 2D Array using malloc in C [duplicate]该程序如何在 C 中使用 malloc 创建二维数组 [重复]
【发布时间】:2021-03-24 04:25:11
【问题描述】:

以下程序如何初始化一个二维数组,在其中存储数据,然后计算所有元素的总和。

我真的很担心动态内存分配在这段代码中的实际工作方式。

这种方法对我来说是新的,因为我找不到任何可以解释这段代码的资源。

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

#define col 5
int main(){
    int n, i, j, sum =0;
    int (*a) [col];
    printf("Enter number of rows: ");
    scanf("%d", &n);
    a = (int (*)[col])malloc(n * col * sizeof(int));

    for(i = 0; i < n; i++){
        for (j=0; j < col ; ++j){
            //pointer to 5 elements row
            scanf("%d", &a[i][j]);
            sum+= a[i][j];
        }
    }

    printf("Sum : %d\n",sum);

    free(a);
    return 0;
}

【问题讨论】:

  • C 和 C++ 是不同的编程语言。 选择一种。您的 minimal reproducible example 是 C 语言。如果您想学习 C,请阅读 this C reference阅读 Modern C。还请阅读您的 C 编译器(例如 GCC...)和调试器的文档(例如GDB...)
  • 这种数组通常不是这样定义的。 int (*a)[col] 定义通常表示为int**a,或者更好的是,使用一维数组,然后应用二维仿真。
  • 另外,malloc 可能会失败,您的代码不会处理该失败。当然scanf 也可能失败,您的代码无法处理这种情况。如果您使用GCC 编译所有警告和调试信息,那么请使用gcc -Wall -Wextra -g。使用GDB,您可以通过运行它来观察程序的动态行为step by step
  • a = (int (*)[col])malloc(n * col * sizeof(int)); 行是做什么的?谁能解释一下。
  • @PrathPratimChaterjee:你读过什么关于 C 编程的书? 答案就在这些书中,需要几十页来解释。我们不会为你一个人写这些。您还可以深入研究简单 C 编译器的源代码,例如 nwcc,以了解 C 编译器如何解析该行。

标签: arrays c pointers malloc


【解决方案1】:

我真的很担心动态内存分配在这段代码中的实际工作方式。

先阅读Modern C 或其他一些关于C的好书

然后查看this C reference。晚了,例如阅读一些 C17 草案标准,例如n2176。它指定malloc(3) 的行为。阅读更多关于call stackautomatic variablesC dynamic memory allocation的信息。

这种方法对我来说是新的,因为我找不到任何可以解释这段代码的资源。

考虑研究GNU libc的源码。它是实现malloc(在Linux上,上面syscalls(2)mmap(2)...)

同时阅读一个很好的operating system textbook。您可能了解malloc 在普通操作系统上的工作原理。它与virtual address space 相关,因为有时 malloc 正在扩大该空间。

当然要阅读 C 编译器的文档(例如 GCC)。启用所有警告和调试信息,所以使用gcc -Wall -Wextra -g。然后阅读调试器的文档(例如GDB)并在调试器下逐步运行程序。

顺便说一句,您的代码有误:malloc(3)scanf(3) 都可能失败,而您无需检查。

最后,从现有的开源软件中汲取灵感用 C 编码,例如 GNU bashGNU bisonGPPGTK。 p>


C 和 C++ 是不同的编程语言

您的问题提到了 C++。 C 和 C++ 非常不同。对于 C++,请先阅读好的 C++ programming book。然后查看this C++ reference。之后,从现有的 C++ 开源软件中汲取灵感,例如 fishQtFLTKRefPerSys 以及 github 上的许多其他软件。


考虑使用静态源代码分析工具

Frama-CClang static analyzer,2021 年可能是Bismon

【讨论】:

  • 由于 OP 是新的,直接跳到标准和 libc 源代码看起来有点大材小用,用这种方式学习语言的基础知识几乎是不可能的。
  • 是的,所以我建议先阅读Modern C。请注意,我的母语不是英语,因此请随时改进措辞
  • a = (int (*)[col])malloc(n * col * sizeof(int)); 行是做什么的?谁能解释一下。
  • 是的。花几天时间阅读一本好的 C 编程书籍。一旦你阅读并理解了它,你就会明白那句话
猜你喜欢
  • 2016-08-21
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多