已经掌握的内存开辟方式有:
int sum = 20;//在栈中开辟4个字节的空间
char arr[10] = {0};//在栈中开辟10个字节的连续空间
这种开辟空间的方式有两个特点
1>空间开辟大小是固定的
2>数组在声明时,必须指定数组的长度,它所需要的内存在编译时分配
但对于空间的需求,有的时候,需要的空间大小是在程序运行时才能知道。
动态内存函数的介绍
malloc和free
void* malloc(size_t size)
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
malloc(申请空间) 使用malloc分配空间是在堆中分配空间
void* free(void* memblock)
free函数用来释放动态开辟的内存。
free(释放空间)
(malloc和free都声明在stdlib.h的头文件中)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
//自定义结构体
typedef struct Student {
char name[256];
int age;
float weight;
}student_t;
int main(){
//1.动态分配空间
student_t* p_stu = (student_t*)malloc(sizeof(student_t));
//2.判断分配是否成功
if(p_stu == NULL)
{
//打印分配失败的信息
//strerror作用是将错误编码转换为对应的错误信息字符串
printf("malloc failed:%s\n",strerror(errno));
return -1;
}
//3.给空间进行赋值
//字符串的拷贝strcpy
strcpy(p_stu->name,"伟");
p_stu->age = 15;
p_stu->weight = 80.6;
//4.通过地址获取值
printf("name=%s,age=%d,weight=%.2f",p_stu->name,p_stu->age,p_stu->weight);
//5.手动释放空间
free(p_stu);
//释放完空间,进行置空操作
p_stu = NULL;
return 0;
calloc
calloc函数也是用来动态内存分配
void* calloc(size_t num,size_t size);
函数的功能是为num个大小为size的元素开辟空间,并且把空间的每个字节初始化为0
与malloc函数的区别只在于calloc会返回地址之前把申请空间的每个字节初始化为0