【发布时间】: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 编译器如何解析该行。