动态内存管理(malloc函数,指针和数组的关系)

关于malloc函数的使用:

先看一个例子:

#include <stdio.h>
#include <malloc.h>

int main()
{
	int len = 0;
	printf("请输入你所需要分配的数组的长度: len = \n");
	scanf("%d",&len);
	int *pArr = (int *)malloc(sizeof(int) * len);

	for(int i = 0; i < len; ++i)
	{
		scanf("%d",&pArr[i]);
	}
	for(int i = 0;i < len; ++i)
	{
		printf("%d\n",*(pArr + i));
	}
    free(pArr);
	return 0;
}

这是一个动态内存申请的程序。里面需要注意的点有很多。一一解释一下。首先解释一下malloc函数。

	int *pArr = (int *)malloc(sizeof(int) * len);

这个函数需要注意的问题:假如要申请int型的内存要使用int* 来申明,可以吧int* 看成一个整体,这个就是int型的地址。然后值malloc函数中的参数,这个只有一个参数,那就是需要申请多少个字节。其中sizeof(int)*len这是一个数,是int型数据占多少个字节。在malloc函数前还有一个强制类型转换,(int *)这是强制转换成int* 就是int型地址。为什么那?

这是因为,malloc返回的是申请的内存的首地址(干地址)。比如我申请了5个int类型的地址。有20个字节。这就是一个数据占4个字节,double* 就告诉编译器,我一个数据占8个字节。(int*)其实就是告诉编译器,我的一个数据占几个字节。

这就是为什么malloc函数前要有个强制类型转换。

 

第二个问题,指针与数组的关系:

在这个例子中可以看到:

scanf("%d",&pArr[i]);

这行代码,pArr是一个指针,可以用表示数组的方式表示,可以用下标。

scanf("%d",pArr+i);

这样也是可以的。

这样的话是不用使用&这个符号的。因为pArr+i本身就是地址的意思。但是不可以使用pArr++,因为这是不是数值的相加,而是地址的相加。

在看这行代码:

printf("%d\n",*(pArr + i));

这个是指针的用法,小括号里面的是地址 整体上是读取地址的值。

可以使用数组的方式:

printf("%d\n",pArr[i]);

这个也是可以的。

做个类比。

#include <stdio.h>
#include <malloc.h>

int main()
{
	int A[5] = {1,2,3,4,5};
	int len = 0;
	printf("请输入你所需要分配的数组的长度: len = \n");
	scanf("%d",&len);
	int *pArr = (int *)malloc(sizeof(int) * len);

	for(int i = 0; i < len; ++i)
	{
		//scanf("%d",&pArr[i]);
		scanf("%d",pArr + i);
	}
	for(int i = 0;i < len; ++i)
	{
		printf("%d\n",pArr[i]);
	}
	for(int i = 0;i < len; ++i)
	{
		printf("这是A数组的值:\n");
		printf("%d\n",A[i]);
		//printf("%d\n",*(pArr + i));
	}
	return 0;
}

执行结果:

这就是数组和指针的用法。 

 

应用:

跨函数使用内存

#include <stdio.h>
#include <malloc.h>

struct Student
{
	int sid;
	int age;
};

struct Student * CreatStudent()
{
	struct Student *ps = (struct Student *)malloc(sizeof(struct Student));
	ps -> sid = 88;
	ps -> age = 99;
}
void ShowStudent(struct Student *pst)
{
	printf("sid = %d age = %d\n",pst -> sid,pst -> age );
}
int main()
{
	struct Student *ps;
	ps = CreatStudent();
	ShowStudent(ps);
        free(ps);
	return 0;
}

执行结果;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

波雅_汉库克

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

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

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

打赏作者

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

抵扣说明:

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

余额充值