动态分配内存的意义:
1.存储的数据 需要延长生命周期
2.一个指针变量需要存储数据,变量本身只能存地址,不能存数据,需要分配内存空间来存储数据
常量字符串的内存空间有系统自动分配
在常量区里面分配 当程序结束会被自动释放
例如:
堆: 如局部变量 int a = 10;离开作用域就自动收回
常量区: 常量 const int a = 1;只能初始化一次,程序结束后释放。
静态区: static 静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变,但程序结束后也会自动释放
栈 自己申请的内存
malloc
意思是(memory alloc)
需要导入头文件#include <stdlib.h>或者#include <malloc.h>
格式为: 变量名= (类型 *) malloc (sizeof(类型)); //void malloc 为无符号型,可以适用于所有的变量类型
calloc
void *calloc([size_t]
功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
realloc
使用realloc动态改变已经分配内存的大小 (重新进行分配)
增加或者减少
格式: 要改变的变量 = (类型 )realloc(要改变的变量, 大小sizeof(类型));
以上三种都 必须自己手动释放,否则会一直占用内存,除非关机重启
释放
格式为:free(变量)
#include <stdio.h>
#include <stdlib.h>
//导入头文件stdlib.h
如果直接用数组接受,会造成空间的大量浪费
例如: char name[100] = {};
而动态分配是用多少给多少
如果使用指针变量接收数据
必须先为这个指针变量分配一片指向的内存空间
有内存空间 才能存数据
int main(){
char *name ;
name = (char *)malloc(10*sizeof(char));
使用malloc (memory alloc)申请内存空间
if(name == NULL){
// 申请内存失败
exit(EXIT_FAILURE);
}
scanf("%s", name);
printf("%s\n",name);
name = (char *)realloc(name, 20*sizeof(char));
//realloc动态改变已经分配内存的大小
增加或者减少
if(name == NULL){
退出前必须将之前分配的内存释放掉,否则会占用内存
free(name);
exit(EXIT_FAILURE);
}
//使用完毕必须自己手动释放内存
free(name);
return 0;
}