C语言中动态内存分配的基础知识

小微 科技C语言中动态内存分配的基础知识已关闭评论119字数 2084阅读模式
摘要一、什么是动态内存分配1.1 静态内存分配与动态内存分配的区别静态内存分配是指在程序编译时就确定了需要分配多少内存。而动态内存分配是指在程序运行时根据需要动态分配内存。1.2 动态...

一、什么是动态内存分配

1.1 静态内存分配与动态内存分配的区分

静态内存分配是指在程序编译时就肯定了需要分配多少内存。而动态内存分配是指在程序运行时依据需要动态分配内存。

1.2 动态内存分配的基本概念

动态内存分配需要用到两个函数:malloc以及free。malloc函数用来申请一块内存空间,free函数用来释放这块内存空间。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

二、经常使用的动态内存分配函数

2.1 malloc函数以及free函数

malloc函数的原型为void malloc,用来申请一个大小为size字节的内存空间,并返回该内存空间的首地址。free函数的原型为void free,用来释放ptr指向的内存空间。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

2.2 calloc函数以及realloc函数

calloc函数的原型为void calloc,用来申请一个大小为nmembsize字节的内存空间,并返回该内存空间的首地址,并将所有字节都初始化为0。realloc函数的原型为void realloc,用来将ptr指向的内存空间大小改成size字节。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

三、动态内存分配的使用

3.1 动态内存分配的优势以及劣势

动态内存分配的优势是可以灵便的依据需要分配内存空间,防止内存挥霍,提高程序的效力。缺陷是容易呈现内存泄漏以及内存溢出。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

3.2 动态内存分配的使用办法

使用动态内存分配可使用malloc、free、calloc、realloc等函数,需要注意内存申请以及释放的正确顺序。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

3.3 动态内存分配的注意事项

在使用动态内存分配时需要注意,申请的内存空间需要被正确的释放,否则会呈现内存泄漏。申请的内存空间内存的大小必需知足实际需求,否则会呈现内存溢出。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

四、动态内存分配的利用实例

4.1 动态内存分配在数组中的利用

动态内存分配在数组中的利用主要触及到数组大小的不肯定性以及程序的灵便性。文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

例如,在一个程序中需要读入一批数据,并对其进行排序。因为数据的数量是不肯定的,因而使用静态数组会致使数组大小过大或太小的问题。而使用动态内存分配可以依据实际数据量来分配数组空间,防止了空间挥霍以及溢出问题。下列是一个简单的使用动态内存分配的程序示例:文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

include <stdlib.h>文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

int main
{
int n, i, *arr;文章源自微观生活(93wg.com)微观生活-https://93wg.com/7326.html

// 读入数据数量
printf;
scanf;

// 分配数组空间
arr = malloc);
if
{
printf;
return 1;
}

// 读入数据
printf;
for
{
scanf;
}

// 对数据进行排序
// ...

// 释放数组空间
free;

return 0;
}

在上述示例中,程序先通过 malloc 函数分配 n 个整型变量大小的空间。然后通过循环读入数据,并对数据进行处理。最后通过 free 函数释放数组空间。因为数组大小是动态分配的,因而可以依据实际数据量的大小使用适合的空间,提高了程序的灵便性。

4.2 动态内存分配在结构体中的利用

动态内存分配在结构体中的利用无比广泛,下列是一些常见的例子:

  1. 动态创立结构体数组

假定需要创立一个拥有可变长度的结构体数组,可使用动态内存分配来实现。例如:

struct Person *persons;
int numPersons = 5;
persons = malloc);

这类情况下,可以依据需要动态调剂数组的大小,而不需要在编译时固定数组的大小。

  1. 动态创立结构体成员

有时候,需要动态创立结构体的某些成员,而这些成员的大小以及数量不能在编译时肯定。这类情况下,可使用指针以及动态内存分配来实现。例如:

struct Book {
char title[100];
char author[100];
int numChapters;
int *chapterPages;
};

struct Book *book = malloc);
book->numChapters = 3;
book->chapterPages = malloc);
book->chapterPages[0] = 10;
book->chapterPages[1] = 20;
book->chapterPages[2] = 30;

在这个例子中,结构体 Book 包括了一个动态创立的 int 数组 chapterPages,数组的大小是在运行时依据 numChapters 的值动态分配的。

  1. 动态创立嵌套结构体

如果结构体中包括另外一个结构体作为成员,可使用相同的办法动态创立嵌套结构体。例如:

struct Address {
char street[100];
char city[100];
char state[100];
char country[100];
};

struct Person {
char name[100];
int age;
struct Address *address;
};

struct Person *person = malloc);
person->address = malloc);
strcpy;
strcpy;
strcpy;
strcpy;

在这个例子中,结构体 Person 包括了另外一个动态创立的结构体 Address,并且在分配 Person 结构体时,也要分配它的 Address 成员。

以上就是微观生活(93wg.com)关于“C语言中动态内存分配的基础知识”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/7326.html