c语言二维数组与动态分配
时间: 2025-01-02 18:39:25 浏览: 10
### C语言中二维数组的动态分配
在C语言中,可以使用`malloc`或`calloc`来实现二维数组的动态内存分配。下面分别介绍这两种方式的具体应用。
#### 使用 `malloc` 进行动态分配
当采用`malloc`函数时,可以通过指针模拟多维数组的行为。具体做法如下:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int row, col;
// 获取行列数
scanf("%d %d", &row, &col);
// 计算所需空间并申请连续的一块内存区域用于存储整个二维数组的数据部分
double *data = (double *)malloc(row * col * sizeof(double));
if (!data) exit(-1); // 如果分配失败则退出程序
// 创建指向每一行首地址的指针数组
double **array = (double **)malloc(row * sizeof(double *));
if (!array) { free(data); exit(-1);}
// 将每行数据的实际位置赋予对应的指针变量
for (int i = 0; i < row; ++i){
array[i] = &(data[col*i]);
}
// 对新创建的二维数组进行初始化操作...
for (int i = 0; i < row; ++i){
for (int j = 0; j < col; ++j){
array[i][j] = rand(); // 此处仅为示例,实际可根据需求设置不同的初始值
}
}
// 输出测试
for (int i = 0; i < row; ++i){
for (int j = 0; j < col; ++j){
printf("%.2f ", array[i][j]);
}
puts("");
}
// 清理资源
free(array);
free(data);
return 0;
}
```
这段代码展示了如何利用单次调用`malloc`完成二维数组的空间预留工作,并通过构建辅助性的指针结构使得后续能够像常规访问静态声明的二维数组那样方便地读写各个元素[^1]。
#### 使用 `calloc` 进行动态分配
相比起`malloc`只负责简单地获取指定字节数量未初始化过的原始区块而言,`calloc`除了同样能获得相应大小的新区段外还会自动将其内部所有的位都设为零。这有助于减少因忘记显式设定初值而引发潜在错误的风险。
下面是基于`calloc`版本的例子:
```c
#include <stdio.h>
#include <stdlib.h>
int main(){
int nRows,nCols;
// 输入维度信息
scanf("%d%d",&nRows,&nCols);
// 分配足够的单元格给所有项加上额外一层用来保存各行起点偏移量
float *elements=(float*)calloc(nRows*nCols,sizeof(float));
if(elements==NULL){printf("Memory allocation failed\n");return -1;}
float **matrix=(float**)calloc(nRows,sizeof(float*));
if(matrix==NULL){free(elements);printf("Memory allocation failed\n");return -1;}
// 设置各子向量入口地址
for(int r=0;r<nRows;++r)
matrix[r]=&elements[r*nCols];
// 填充随机数值作为示范用途
srand(time(NULL));
for(int y=0;y<nRows;++y)
for(int x=0;x<nCols;++x)
matrix[y][x]=(rand()%10)+((rand()%10)/10.f);
// 展现最终成果
for(int y=0;y<nRows;++y){
for(int x=0;x<nCols;++x)
printf("%.2f\t",matrix[y][x]);
putchar('\n');
}
// 结束前记得回收已使用的堆上对象
free(matrix);
free(elements);
return 0;
}
```
此片段说明了借助于`calloc`不仅可简化某些场景下的编程流程而且提高了安全性。
阅读全文