一、介绍
一般定义数组是要给固定的长度,当我们不知道输入的长度是多少的时候,怎么办
例如:需求现在有一个电话本存储,电话本中联系人并不知道有多少,一次定义1000个长度会占用内存,定义太小又会导致存储不够
c语音给了一种特殊的方式,动态内存分配
二、函数介绍
头文件
#include <stdio.h>
1、void *malloc(int num);
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的
2、void calloc(int num, int size);
在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 numsize 个字节长度的内存空间,并且每个字节的值都是0
3、void *realloc(void *address, int newsize);
该函数重新分配内存,把内存扩展到 newsize
4、void free(void *address);
该函数释放 address 所指向的内存块,释放的是动态分配的内存空间
三、使用说明
动态分配内存,内存的来源是ram,准确说是ram中的堆内存,硬件上外拓sdram或者ddr的平台,软件上一般是上操作系统的平台
使用步骤:
1、动态分配内存
2、指针映射内存
3、使用
4、释放
注意:用完一定要释放内存,不然会造成内存泄漏
四、示例
1、函数使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* 动态分配内存 */
description = (char *)malloc( 200 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory\n");
}
else
{
strcpy( description, "Zara ali a DPS student in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
}
2、工程实例
以电话本为例
常规数组操作
typdef struct {
char name[20];
char tel_num[11];
}tel_def;
tel_def Contact[1000] = {0};
动态内存分配操作
typdef struct {
char name[20];
char tel_num[11];
}tel_def;
tel_def *Contact[1000] = {0};
//使用的时候
Contact[0] = (tel_def *)malloc(sizeof(tel_def ));