C语言:实现使用malloc函数模拟开辟一个二维数组

       

目录

解题思路

步骤一:开辟空间

步骤二:使用空间

步骤三:释放空间

图解

完整代码展示:注意看注释


 在C语言编程中,处理多维数据结构时,我们通常会遇到二维数组。然而,对于特定大小或需要动态调整的情况,静态定义的二维数组可能无法满足需求。这时,我们需要借助动态内存分配来创建和管理二维数组。本篇博客将详细解析如何使用malloc()函数动态创建一个二维数组,并在使用完毕后正确释放其内存。我们将通过一个具体的代码示例来展示这一过程,同时阐述解题思路。

解题思路

步骤一:开辟空间

首先,我们需要为二维数组的每一行(即第一维)分配内存。这里,我们希望创建一个3行5列的二维数组。因此,我们声明一个指针int** p,它将指向一个包含3个元素的指针数组,每个元素又分别指向一个包含5个整数的数组。

int** p = (int**)malloc(3 * sizeof(int*));

这段代码使用malloc()函数为p分配了足够容纳3个int*指针的空间。注意类型转换为(int**),确保p可以存储指针数组。


接下来,我们需要为每一行(即第二维)分配内存。在循环中,为p的每个元素(即每行)分配一个能容纳5个整数的空间:

for (int i = 0; i < 3; i++)
{
    p[i] = (int*)malloc(5 * sizeof(int));
}

此处的malloc()调用为p[i]分配了5个int大小的内存,并将其地址赋值给p[i]。注意这里应分配sizeof(int)而非sizeof(int*),因为我们实际存储的是整数而非指针。


步骤二:使用空间

有了已分配的内存,我们可以像操作普通二维数组一样对动态数组进行赋值和访问。在嵌套循环中,遍历所有元素并为其赋值,然后打印出来:

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 5; j++)
    {
        p[i][j] = i * 5 + j;
        printf("%d\t", p[i][j]);
    }
    printf("\n");
}

这里,我们按照i * 5 + j的公式为每个元素赋值,以直观地展示其位置关系。每次内层循环结束后打印换行符,以便在输出中区分不同的行。

步骤三:释放空间

使用完动态数组后,务必对其进行内存释放,防止内存泄漏。由于我们分两步进行了内存分配,释放时也需按照逆序进行:

  • 先释放每一行(第二维)的内存:
for (int i = 0; i < 3; i++)
{
    free(p[i]);
}
  • 再释放整个数组(第一维)的内存:
free(p);

最后,将指针p置为NULL,这是一个良好的编程习惯,有助于避免后续误用已释放的内存:

p = NULL;

图解

完整代码展示:注意看注释


int main() {
	//开辟空间
	int** p = (int**)malloc(3 * sizeof(int*));//int *(*p) 行
	if (p == NULL)
	{
		assert(p);
	}
	for (int i = 0; i < 3; i++)
	{
		p[i] = (int*)malloc(5 * sizeof(int*));//列
		if (p == NULL)
		{
			assert(p);
		}
	}
	//使用空间
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++) {
			p[i][j] = i * 5 + j;//给二维数组赋值
			//0*5+0  0*5+1  0*5+2 ....
			printf("%d\t", p[i][j]);
				
		}
		printf("\n");
	}

	//释放空间
	//由于开辟了两次空间
	for (int i = 0; i < 3; i++)
	{
		free(p[i]);
	}
	free(p);
	p == NULL;
	return 0;
}

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普通young man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值