关于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;
}
执行结果;