html:
toc: true
写在前面:
- 出于作者不了解C99以前标准中对二维数组的动态声明而导致的一场考场事故,作者写下这篇文章,,以便其他同学在遇到类似问题时不要犯同样的错误,同时作为对自己的警醒.
- 本文主要是关于对于二维数组动态声明问题在不同C标准下方法的探讨,将给出一个简单的实例,以便读者能够快速理解.
- 作者水平有限,若有错误,还请指正.
一个简单的实例
- 题目描述:
对输入的一个矩阵的偶数列分别求和并输出;
输入说明:输入两个整数m,n代表矩阵的行数和列数,接下来输入m行,每行n个整数,代表矩阵的元素,数与数之间以空格隔开;
输出说明:先输出偶数列的个数,然后输出每个偶数列所有元素的和,每个和后面有一个空格;
输入示例:
3 4
3 5 6 7
9 5 8 2
6 5 8 7
输出示例:
2
15 16 - 要解决这个问题,我们可以声明一个二维数组,然后控制输入输出流程完成问题即可.但是注意到矩阵的行列数是未知的,因此我们需要使用动态数组来完成这个任务.
C99标准以及C99标准之后
在C99标准之后,要完成这个问题,只需要引入变长数组(variable length array)方法即可简单完成.
#include <stdio.h>
int main(void){
int m, n;
scanf("%d %d", &m, &n);
int matrix[m][n];
// 输入矩阵元素
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
scanf("%d", &matrix[i][j]);
// 计算偶数列的和
int sum[n / 2]; // 用于存储每个偶数列的和
int count = 0; // 偶数列的个数
for (int j = 1; j < n; j += 2){
int column_sum = 0;
for (int i = 0; i < m; i++){
column_sum += matrix[i][j];
}
sum[count++] = column_sum;
}
printf("%d\n", count);
for (int i = 0; i < count; i++){
printf("%d ", sum[i]);
}
return 0;
}
可以看到,对于二维数组的动态声明,使用变长数组方法可以直接使用类似于int matrix[m][n]这样的语句完成.
但是要注意的是,变长数组方法只能在C99标准之后使用,因为该方法是在C99标准中引入的,在C99之前,使用变长数组方法会报错.要动态分配二维数组,要借助指针传参.
现行部分学校旧OJ系统使用C89(C90)标准,使用变长数组将无法完成编译(血泪教训)
C99标准以前
在C99标准之前,要完成这个问题,我们需要使用指针来完成.
通常的步骤为:
- 声明一个指向指针的指针,用于保存动态分配的二维数组的首地址
- 使用malloc函数动态分配一个包含n行的指针数组,每个指针指向一个包含m个元素的一维数组
- 对分配的二维数组进行赋值或操作
- 在不需要使用该数组时,使用free函数释放分配的内存
具体示例如下:
#include <stdio.h>
#include <stdlib.h>//使用malloc函数需要
int main(void){
int m, n;
scanf("%d %d", &m, &n);
//分配指向指针的指针数组
int **matrix = (int **)malloc(m * sizeof(int *));
//对每一行再分配空间并输入
for (int i = 0; i < m; i++){
matrix[i] = (int *)malloc(n * sizeof(int));
for (int j = 0; j < n; j++){
scanf("%d", &matrix[i][j]);
}
}
// 计算偶数列的和
int sum[n / 2]; // 用于存储每个偶数列的和
int count = 0; // 偶数列的个数
for (int j = 1; j < n; j += 2){
int column_sum = 0;
for (int i = 0; i < m; i++){
column_sum += matrix[i][j];
}
sum[count++] = column_sum;
}
// 输出结果
printf("%d\n", count);
for (int i = 0; i < count; i++){
printf("%d ", sum[i]);
}
// 释放内存
for (int i = 0; i < m; i++){
free(matrix[i]);
}
free(matrix);
matrix = NULL;
return 0;
}
标签:matrix,int,C99,++,二维,数组,sum
From: https://www.cnblogs.com/mie9/p/17968240