C语言基础教程(动态内存分配)

简介: C语言基础教程(动态内存分配)

前言

本篇文章来讲解C语言中的动态内存分配,在C语言中动态内存分配经常使用,合理的使用动态内存分配可以帮助我们节省代码空间,当然了不合理的使用可能导致程序的崩溃,或者是内存的泄漏。


一、动态内存分配常用函数

在 C 语言中,动态内存分配是一种在程序运行时分配和释放内存的机制。它允许程序根据需要动态地管理内存,以便灵活地创建、使用和销毁变量和数据结构。动态内存分配使用以下四个函数来执行相关操作:malloc、calloc、realloc 和 free。

1.malloc 函数:

malloc(memory allocate)函数用于在堆(heap)区分配指定大小的内存块,并返回指向分配的内存块的指针。其语法如下:

void* malloc(size_t size);

其中 size 是要分配的字节数。malloc 返回一个指向分配内存块的指针,如果分配失败,则返回 NULL。

2.calloc 函数:

calloc(contiguous allocation)函数用于在堆区分配指定数量和大小的连续内存块,并将其初始化为 0。其语法如下:

void* calloc(size_t num, size_t size);

其中 num 是要分配的元素数量,size 是每个元素的字节数。calloc 返回一个指向分配内存块的指针,如果分配失败,则返回 NULL。

3.realloc 函数:

realloc(reallocate)函数用于重新分配之前通过 malloc 或 calloc 分配的内存块的大小。其语法如下:

void* realloc(void* ptr, size_t size);

其中 ptr 是之前分配的内存块的指针,size 是要重新分配的字节数。realloc 返回一个指向重新分配内存块的指针,如果分配失败,则返回 NULL。注意,realloc 可能会将已分配内存的内容复制到新的内存块中,因此原内存块的内容可能会丢失或损坏。

4.free 函数:

free 函数用于释放通过 malloc、calloc 或 realloc 分配的内存块。其语法如下:

void free(void* ptr);

其中 ptr 是要释放的内存块的指针。调用 free 将释放该内存块,并该内存区域变为可用状态,可以供后续的动态内存分配使用。

使用动态内存分配可以在程序运行时灵活地处理变量和数据结构的内存需求,避免静态内存分配的固定限制。但是,使用动态内存分配时需要注意内存泄漏和悬挂指针等问题,确保正确释放已分配的内存,并避免出现未定义的行为。


二、动态内存分配实战

1.使用 malloc 分配内存:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* ptr;
    int size = 5;
    // 在堆上分配大小为 size * sizeof(int) 的内存块
    ptr = (int*)malloc(size * sizeof(int));
    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    // 使用分配的内存块
    for (int i = 0; i < size; i++) {
        ptr[i] = i + 1;
    }
    // 打印内存块中的值
    for (int i = 0; i < size; i++) {
        printf("%d ", ptr[i]);
    }
    // 释放内存块
    free(ptr);
    return 0;
}

2.使用 calloc 分配内存:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* ptr;
    int size = 5;
    // 在堆上分配大小为 size * sizeof(int) 的内存块,并初始化为 0
    ptr = (int*)calloc(size, sizeof(int));
    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    // 使用分配的内存块
    for (int i = 0; i < size; i++) {
        ptr[i] = i + 1;
    }
    // 打印内存块中的值
    for (int i = 0; i < size; i++) {
        printf("%d ", ptr[i]);
    }
    // 释放内存块
    free(ptr);
    return 0;
}

3.使用 realloc 重新分配内存:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* ptr;
    int size = 5;
    // 在堆上分配大小为 size * sizeof(int) 的内存块
    ptr = (int*)malloc(size * sizeof(int));
    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    // 使用分配的内存块
    for (int i = 0; i < size; i++) {
        ptr[i] = i + 1;
    }
    // 打印内存块中的值
    for (int i = 0; i < size; i++) {
        printf("%d ", ptr[i]);
    }
    // 重新分配内存块大小为 10 * sizeof(int)
    ptr = (int*)realloc(ptr, 10 * sizeof(int));
    if (ptr == NULL) {
        printf("内存重新分配失败\n");
        return 1;
    }
    // 使用重新分配的内存块
    for (int i = size; i < 10; i++) {
        ptr[i] = i + 1;
    }
    // 打印内存块中的值
    for (int i = 0; i < 10; i++) {
        printf("%d ", ptr[i]);
    }
    // 释放内存块
    free(ptr);
    return 0;
}

总结

本篇文章就讲解到这里,大家可以多加练习更好的掌握本篇文章的知识点。

相关文章
TU^
|
11天前
|
C语言
C语言内存函数和字符串函数模拟实现
C语言内存函数和字符串函数模拟实现
TU^
25 0
|
5天前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
15 0
|
6天前
|
存储 程序员 C语言
C语言(15)----动态内存讲解
C语言(15)----动态内存讲解
17 1
|
6天前
|
C语言
C语言(11)----内存函数
C语言(11)----内存函数
12 1
|
6天前
|
存储 测试技术 C语言
C语言内存管理函数研究
C语言内存管理函数研究
15 0
|
7天前
|
存储 算法 程序员
零基础C语言“函数”教程,有手就行
零基础C语言“函数”教程,有手就行
|
7天前
|
存储 编译器 C语言
玩转C语言——C语言中内存存储
玩转C语言——C语言中内存存储
14 0
|
7天前
|
程序员 编译器 C语言
C语言——动态内存管理
C语言——动态内存管理
13 0
|
7天前
|
C语言
C语言内存操作函数
C语言内存操作函数
14 1
|
10天前
|
存储 程序员 编译器
C语言变量声明内存分配(转载)
C语言变量声明内存分配(转载)
17 0