C语言基础教程(动态内存分配)
  micz61TEX78l 2023年11月13日 28 0

(文章目录)


前言

本篇文章来讲解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;
}

总结

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  HE3leaVn7jMN   2023年11月24日   28   0   0 Timei++#include
  HE3leaVn7jMN   2023年11月26日   28   0   0 i++#include
micz61TEX78l