动态内存管理

包含头文件

#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);:释放之前由 malloccallocrealloc 分配的内存空间。
  • 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;
}