利用malloc函数分配二维数组

        利用malloc()函数分配的内存是连续的的,我们可以先分配二维数组的行(即行指针),然后利用分配的行指针,再分配列指针。咱们以分配一个4x5的二维数组为例,如下图():

1、先分配连续的4块内存作为行,这些分配内存是连续的,并将S指向它

	S = (char**)malloc(sizeof(char*) * row);

 2、利用之前分配好的4块内存,每块内存(即对应的行)再分配5块内存作为列,每行指向对应分配好的5块内存(相当列)

for (i = 0; i < row; i++)
		S[i] = (char*)malloc(sizeof(char) * col);

注:每一行分配的内存是连续,但相邻两行的内存不一定连续(由于每次用malloc()给一行分配内存(这行内存分配的内存是连续的),下一次给下一行分配内存,不一定紧接着上一行最后的内存的地址,故相邻两行的内存不一定连续,即整体不连续)

3、测试程序

/*获取的二维数组,只有一行一行是连续的,但整体不是连续的*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char** S;
	int row, col, i, j;
	printf("请输入你需要创建的二维数组的行和列!!!\n");
	printf("请输入行:");
	scanf("%d", &row);
	printf("请输入列:");
	scanf("%d", &col);
	/*利用malloc申请内存*/
	S = (char**)malloc(sizeof(char*) * row); // 分配行
	for (i = 0; i < row; i++)
		S[i] = (char*)malloc(sizeof(char) * col); // 分配列
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			printf("%p	", &S[i][j]);
		printf("\n");
	}
	/*利用malloc()函数分配的内存在程序退出时,不要忘了利用free()函数释放
	要不容易造成内存泄漏*/
	/*释放申请的内存*/
	for (i = 0; i < row; i++) // 先释放分配的列
		free(S[i]);
	free(S);				  // 再释放分配的行
	return 0;
}

 程序输出:

         由程序输出可以得出,每一行是连续的,但相邻行却不是连续的,符合上面的解释。

总结:利用这种方法分配的内存只要一行一行是连续的,但整体不会像声明的二维数组那样整体连续。

### 使用 `malloc` 函数二维数组动态分配内存并初始化 在 C 语言中,可以使用 `malloc` 动态地为二维数组分配内存,并对其进行初始化。以下是几种常见的方式。 #### 方法一:通过指针数组实现 这种方法涉及创建一个指向每行的指针数组,再分别为每一行分配内存: ```c #include <stdio.h> #include <stdlib.h> int main() { int rows = 3; int cols = 4; // 创建一个指向整数指针的一级指针 int **array = (int **)malloc(rows * sizeof(int *)); // 如果分配失败则返回错误提示 if (!array) { fprintf(stderr, "Memory allocation failed\n"); exit(EXIT_FAILURE); } // 分配各行的空间 for (int i = 0; i < rows; ++i) { array[i] = (int *)malloc(cols * sizeof(int)); // 若某一行分配失败,则释放已分配资源并退出程序 if (!array[i]) { while (--i >= 0) free(array[i]); free(array); fprintf(stderr, "Row memory allocation failed\n"); exit(EXIT_FAILURE); } } // 初始化所有元素为特定值(这里设为1) for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { array[i][j] = 1; } } // 打印验证 for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { printf("%d ", array[i][j]); } putchar('\n'); } // 清理工作 for (int i = 0; i < rows; ++i) free(array[i]); free(array); return 0; } ``` 此方法提供了直观的二维索引操作形式 `array[row][col]`[^1]。 #### 方法二:一次性分配整个区域作为单个大块 这种方式更高效,因为只需要一次调用 `malloc` 即可完成全部分配任务;同时保持数据存储上的连续性,有助于提高缓存命中率: ```c #include <stdio.h> #include <stdlib.h> #define ROWS 3 #define COLS 4 int main(){ size_t totalSize = ROWS * COLS; int (*matrix)[COLS]; matrix = malloc(totalSize * sizeof(*matrix)); if(matrix == NULL){ perror("Failed to allocate memory."); exit(EXIT_FAILURE); } // 对矩阵中的每一个元素赋初值 for(size_t row=0 ;row<ROWS;++row){ for(size_t col=0;col<COLS;++col){ matrix[row][col]=1; } } // 输出测试 for(size_t r=0;r<ROWS;++r){ for(size_t c=0;c<COLS;++c){ printf("%d ",matrix[r][c]); } puts(""); } // 解除占用 free(matrix); return EXIT_SUCCESS; } ``` 上述代码展示了如何声明一个指向固定列宽数组类型的指针变量来简化访问逻辑[^2]。 这两种方案各有优劣,在实际应用时可根据具体需求选择合适的做法。对于大多数情况而言,第二种方式由于其简洁性和性能优势而更为推荐。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值