当前位置: 代码迷 >> 综合 >> 【C进阶】动态内存管理(malloc、free、calloc、realloc)
  详细解决方案

【C进阶】动态内存管理(malloc、free、calloc、realloc)

热度:33   发布时间:2023-11-26 15:35:58.0

目录

前言

1.动态内存函数介绍

1.1 malloc

1.2 free

1.3 calloc

1.4 realloc

2.例题

2.1 题目一

2.2 题目二

2.3 题目三

总结


前言

        有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态内存开辟了。

1.动态内存函数介绍

1.1 malloc

void* malloc (size_t size);

        这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

         如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

1.2 free

        void free (void* ptr);

        free函数用来释放动态开辟的内存。

        如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。

1.3 calloc

        C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);

        函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

1.4 realloc

        realloc函数的出现让动态内存管理更加灵活。 有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时 候内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小 的调整。 函数原型如下:        

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

        ptr 是要调整的内存地址 size 调整之后新大小 返回值为调整之后的内存起始位置。 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。 realloc在调整内存空间的是存在两种情况:

1.要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

2.原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。

2.例题

2.1 题目一

        分析以下代码的错误

void GetMemory(char *p)
{p = (char *)malloc(100);
}
void Test(void)
{char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}

分析:

1.内存泄漏。malloc没有搭配free使用

2.malloc后没有判定返回值为NULL

3.GetMemory函数并不能修改str的值     

2.2 题目二

        分析以下代码的错误

char *GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char *str = NULL;str = GetMemory();printf(str);
}

分析:

1.p是局部变量,使用完后就销毁了。printf函数访问的内存无意义

2.3 题目三

        分析以下代码的错误

void GetMemory(char **p, int num)
{*p = (char *)malloc(num);
}
void Test(void)
{char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}

分析:

1.内存泄漏。malloc没有搭配free使用

2.malloc后没有判定返回值为NULL  

总结

        多多练习