C语言编写二维数组内存分配函数出现类型转换警告如何解决
问题核心原因
- 类型匹配错误:你代码中
**arr的类型是int,而malloc返回的是内存地址指针,把指针直接赋值给int类型变量,直接触发你收到的类型转换警告。 - 参数传递逻辑错误:要在
allocate函数内部修改main函数中matrix(本身是int**类型)的取值,需要传入matrix的地址,对应的形参类型应该是int***,你原来的函数形参是int**,就算传入&matrix类型也不匹配,自然无法正常运行。 - 二维数组分配逻辑错误:你当前的代码直接分配
r*c大小的一维内存,没有处理行指针的映射,后续也无法用matrix[i][j]的形式访问二维数组元素。
修复方案
方案1:三级指针传参,分配标准指针数组形式二维数组
这是最贴合你想通过参数返回分配结果的实现方式:
#include <stdlib.h> #include <stdio.h> void allocate(int ***arr, int r, int c) { // 先分配r个行指针的内存空间 *arr = (int **)malloc(r * sizeof(int *)); // 给每一行分配c个int类型的存储空间 for(int i = 0; i < r; i++) { (*arr)[i] = (int *)malloc(c * sizeof(int)); } } int main( void ) { int NO_OF_COLS = 0; int NO_OF_ROWS = 0; scanf("%d%d", &NO_OF_ROWS, &NO_OF_COLS); int **matrix; // 传入matrix的地址给allocate函数 allocate(&matrix, NO_OF_ROWS, NO_OF_COLS); // 测试访问,可正常用[i][j]下标访问 matrix[0][0] = 1; printf("%d", matrix[0][0]); // 使用结束后按顺序释放内存:先释放每行空间,再释放行指针数组 for(int i = 0; i < NO_OF_ROWS; i++) { free(matrix[i]); } free(matrix); return 0; }
方案2:分配连续内存块(缓存友好、释放更简单)
如果需要二维数组的所有元素存储在连续内存中,可以用这个实现,读写效率更高:
#include <stdlib.h> #include <stdio.h> void allocate(int ***arr, int r, int c) { *arr = (int **)malloc(r * sizeof(int *)); // 一次性分配所有元素的连续内存 int *data_buf = (int *)malloc(r * c * sizeof(int)); // 给每个行指针映射对应偏移的内存地址 for(int i = 0; i < r; i++) { (*arr)[i] = data_buf + i * c; } } int main( void ) { int NO_OF_COLS = 0; int NO_OF_ROWS = 0; scanf("%d%d", &NO_OF_ROWS, &NO_OF_COLS); int **matrix; allocate(&matrix, NO_OF_ROWS, NO_OF_COLS); matrix[1][2] = 10; printf("%d", matrix[1][2]); // 释放时先释放数据块,再释放行指针数组即可 free(matrix[0]); free(matrix); return 0; }
简化方案:直接返回分配好的指针
如果不想使用三级指针,可以直接让分配函数返回int**类型,代码更直观:
int** allocate(int r, int c) { int **arr = (int **)malloc(r * sizeof(int *)); for(int i = 0; i < r; i++) { arr[i] = (int *)malloc(c * sizeof(int)); } return arr; } // main中调用方式: // int **matrix = allocate(NO_OF_ROWS, NO_OF_COLS);
内容的提问来源于stack exchange,提问作者SilverMoon17
相关产品推荐
相关产品推荐

