动态内存管理
传统通过数组或者变量开辟空间的大小是固定的,且数组必须制定长度。 实际上对于程序空间的大小,可以内存函数自主进行管理。 且开辟的空间申请在堆区(变量在栈区)
动态内存函数
malloc
void* malloc (size_t size);
向内存申请一块连续可用的空间 如果成功,返回开辟好的空间。 如果失败,返回一个库函数特定的指针(一般为NULL)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int len = 0;
char* str;
printf("请输入你想要的字符串长度:>\n");
scanf("%d", &len);
str = (char*)malloc(len+1);
if (str == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
int i = 0;
for (i = 0; i < len; i++)
{
*(str+i) = rand() % 26 + 'a';
}
str[i] = '\0';
printf("随机字母为: %s\n", str);
free(str);
p = NULL;
return 0;
}
使用内存函数一定注意
- 判断空间是否开辟成功
- free函数重新释放空间,防止内存泄漏
- 释放后赋空指针,防止再次引用
free
void free (void* ptr); malloc和free都声明在 stdlib.h 头文件中。
从上段代码看出,free函数是专门是用来做动态内存的释放和回收的。 tips:
- 指向的空间不是动态开辟的,free函数的行为未定义。
- 如果参数 ptr 是NULL指针,则函数什么事都不做。
calloc
void* calloc (size_t num, size_t size); (与malloc类似)
使用calloc,该函数会开辟 num个大小为 size的一块连续空间,并且会把每个字节初始化全0(也是与malloc的主要区别)
int main()
{
int* p = (int *)calloc(10, sizeof(int));
if (p == NULL)
{
printf("%s", strerror(errno));
return 1;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
free(p);
p = NULL;
return 0;
}
realloc
void* realloc (void* ptr, size_t size);
re-alloc函数,顾名思义,对已经开辟的空间进行调整。
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
int* pp = NULL;
pp = (int*)realloc(p, 80);
if (pp != NULL)
{
p = pp;
}
free(p);
p = NULL;
return 0;
}
对比再次开辟后的内存,发现两次地址已经变化了 原因是因为:realloc在调整内存空间的是存在两种情况
- 原空间后有足够大的空间可以调整
- 原空间后大小不足,则会在堆空间上另找一个合适大小
的连续空间来使用,这样函数返回的是一个新的内存地址。
文章仅供学习交流参考,觉得有用可以分享一下,十分感谢。
|