如何申请动态二维数组?


方法一 : 指针数组

在这里插入图片描述

其中array是二级指针,

  1. 先给array分配内存,做为每一行的起点
  2. 再给每行的起点,array[i] 分配内存, 即分配列内存
void test()
{

	int row = 5, col = 5;
	int** array;

	// 分配一个指针数组,其中每个元素都将指向一行
	array = (int**)malloc(row * sizeof(int*));
	if (array == NULL) {
		// 处理内存分配失败的情况
		exit(1);
	}

	// 为每一行分配内存
	for (int i = 0; i < row; ++i) {
		array[i] = (int*)malloc(col * sizeof(int));
		printf("%p\n", array[i]);
		
	}
	/*********对这个二维数组赋值***********/
	array[1][1] = 1;   //和正常一样
	printf("%d", array[1][1]);
}

注意

这样分配的内存对各行的地址不连续
在这里插入图片描述
差值 1-2: 9570922722688 - 9570922722384 = 304 字节
差值 2-3: 9570922722384 - 9570922722816 = -432 字节
差值 3-4: 9570922722816 - 9570922722432 = 384 字节
差值 4-5: 9570922722432 - 9570922722352 = 80 字节

方法二 :数组指针

与法一相比,各行的地址是连续的

#include<stdio.h>
#include<malloc.h>
int main()
{
	//直接申请3行4列的二维数组指针
	int(*p)[4] = (int(*)[4])malloc(3 * 4 * sizeof(int)); 
	
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("%p\n", &p[i][j]); //打印每一个变量的地址
		}
	}
	free(p); //用完之后,最后把p释放掉
	return 0;
}

注意

  1. 与法一相比各行的地址是连续的
  2. 申请内存时如 其中的强转类型 里不能填变量
    int(*)[x] 这样的写法错的
    int(*p)[4] = (int(*)[4])malloc(3 * 4 * sizeof(int));
    • 也就是说方法二不能满足希望申请不同大小内存的情况,因为申请内存时的强转部分里必须要是常量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值