一、malloc函数
1、什么是malloc函数
malloc是memery(内存)和allocate(分配)的缩写,顾名思义,malloc函数为动态分配内存的意思
2、malloc函数语句
int *p=(int *)malloc(sizeof(int))
malloc函数的形参为申请的内存空间大小,上述申请了一个int型数据的大小
malloc函数的返回值是这一块内存空间的首地址,上述代码即是将指针变量p指向这动态申请内存的
首地址。
(*int)强制类型转换,即将该返回的地址类型强制转换为一个整型变量的地址,也就是说p和p+1相差
一个整型大小。
上述代码一个申请了12个字节的内存大小,p变量占8个字节(与cpu的大小有关),
p指向的内存为4个字节。
p本身的内存是静态分配的,p指向的内存是动态分配的
free(p)把p指向的内存释放掉,而p本身的内存只能由程序执行完毕,系统自动释放
3、malloc函数的用法
int *parry=(int *)malloc(sizeof(int*5);
动态申请5个整型变量大小的内存,即20个字节,parry指针变量指向的是该内存的首地址,
int * 表示该指针变量只能指向int型变量的地址,故parry等价于指向前4个字节,
*parry等价于parry[0];
#include <stdio.h>
#include <malloc.h>
int main()
{
int *parry = (int *)malloc(sizeof(int) * 5);
for (int i = 0; i < 5; i++)
{
printf("请输入%d个元素的值\n", i + 1);
scanf("%d", &parry[i]);
}
for (int i = 0; i < 5; i++)
{
printf("第%d的值为 %d \n", i + 1, parry[i]);
}
return 0;
}
创建动态数组的好处
- 1、动态的决定数组的大小
- 2、数组可以由程序员动态的创建和释放
- 3、数组可跨函数使用
4、初始化内存空间
以mem开头的函数被编入字符串标准库,函数的声明包含在头文件string.h中
- memset:使用一个常量字节填充内存空间
- memcpy:拷贝内存空间
- memmov:拷贝内存空间
- memcmp:比较内存空间
- memchar:在内存空间搜索一个字符
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int *parry = (int *)malloc(sizeof(int) * 5);
if (parry == NULL)
{
exit(-1);
}
memset(parry, 0, sizeof(int) * 5);
for (int i = 0; i < 5; i++)
{
printf("%d ", parry[i]);
}
free(parry);
return 0;
}
二、calloc函数
动态申请内存空间,并对其初始化
int *p=(int*)calloc(4,sizeof(int));
上述语句等价于
int *p=(int*)malloc(4*sizeof(int));
memset=(p,0,4*sizeof(int));
三、realloc函数
重新分配内存空间
int *ptr=NULL;
ptr = (int *)realloc(ptr, sizeof(int));//返回新的内存地址给ptr,ptr原本的值保存在新的内存空间
编写代码:让用户任意输入整数,输入一个整数,就动态添加一个内存空间,直到用户输入-1为止
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int num = 0;
int i = 0;
int *ptr = (int *)malloc(sizeof(int));
if (ptr == NULL)
{
exit(-1);
}
while (1)
{
printf("请用户输入想要录入的数,输入-1跳出程序\n");
scanf("%d", &num);
if (num == -1)
break;
ptr[i] = num;
i++;
ptr = (int *)realloc(ptr, sizeof(int) * (i + 1));
if (ptr == NULL)
{
exit(-1);
}
}
for (int j = 0; j < i; j++)
{
printf("%d ", ptr[j]);
}
free(ptr);
return 0;
}