动态内存管理(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++,因为这是不是数值的相加,而是地址的相加。

在看这行代码:

扫描二维码关注公众号,回复: 5547249 查看本文章
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;
}

执行结果;

猜你喜欢

转载自blog.csdn.net/m0_38036750/article/details/87931076