动态内存管理
包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
空指针和野指针
- 空指针是指向0的指针
- 野指针是指向不确定或者指针非法区域的指针,指针未初始化可能会导致野指针,malloc函数动态申请内存返回的指针被free函数释放后未让其指向0也会导致野指针
结构体定义
定义一个结构体 student
,用于存储学生信息。
struct student {
char name[100];
int age;
};
动态内存申请
使用 malloc
函数申请内存。
int *integer = malloc(sizeof(int)); // 申请四个byte的内存给int变量
double *doublePointer = malloc(sizeof(double)); // 申请八个byte的内存给double变量
char *name = malloc(101); // 申请一百零一个byte的内存给字符数组
struct student *stu = malloc(sizeof(struct student)); // 给结构体申请内存
使用动态申请的内存
对动态申请的内存进行赋值和使用。
*integer = 4;
*doublePointer = 8.8;
strcpy(name, "杨逸");
strcpy(stu->name, name);
stu->age = *integer;
打印动态申请的内存内容
printf("integer的值:%d\n", *integer);
printf("doublePointer的值:%lf\n", *doublePointer);
printf("name的值:%s\n", name);
printf("stu.name的值:%s\n", stu->name);
printf("stu.age的值:%d\n", stu->age);
释放动态申请的内存
使用 free
函数释放内存。
free(integer);
free(doublePointer);
free(name);
free(stu);
将指针置空
避免野指针的产生。
integer = 0;
doublePointer = 0;
name = 0;
stu = 0;
函数原型
void *malloc(size_t size);
:分配size
字节的内存空间,并返回指向它的指针。如果分配失败,返回NULL
。void free(void *pointer);
:释放之前由malloc
、calloc
或realloc
分配的内存空间。char *strcpy(char *dest, const char *src);
:将字符串src
复制到dest
,包括空字符void *memset(void *s, int c, size_t n);
:将s
指向的内存的前n
个字节设置为c
。
完整实例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
空指针是指向0的指针;
野指针是指向不确定或者指针非法区域的指针,指针未初始化可能会导致野指针,malloc函数动态申请内存返回的指针被free函数释放后未让其指向0也会导致野指针.
*/
struct student {
char name[100];
int age;
};
int main() {
// 申请内存函数
// void *malloc(size_t size),表示申请size字节的连续内存,返回内存起始位置的指针,失败返回0
// 释放内存函数
// void free(void *pointer),表示释放指针*pointer指针的内存,无返回
// 申请四个byte的内存给int变量
int *integer = malloc(sizeof(int));
// 申请八个byte的内存给double变量
double *doublePointer = malloc(sizeof(double));
// 申请一百零一个byte的内存给字符数组
char *name = malloc(101);
// 给结构体申请内存
struct student *stu = malloc(sizeof(struct student));
// 使用动态申请的内存
*integer = 4;
*doublePointer = 8.8;
strcpy(name, "杨逸");
strcpy(stu->name, name);
stu->age = *integer;
// 打印动态申请的内存内容
printf("integer的值:%d\n", *integer);
printf("doublePointer的值:%lf\n", *doublePointer);
printf("name的值:%s\n", name);
printf("stu.name的值:%s\n", stu->name);
printf("stu.age的值:%d\n", stu->age);
// 释放动态申请的内存
free(integer);
free(doublePointer);
free(name);
free(stu);
// 所有指针置空
integer = 0;
doublePointer = 0;
name = 0;
stu = 0;
return 0;
}