一、动态内存函数
(一)malloc
函数与free
函数(<stdlib.h>)
malloc
函数向堆区申请一块连续的空间,并返回这块地址的指针。- 开辟成功,返回的指针类型是
void*
,需要强制类型转换为自己的指针类型。 - 开辟失败,返回
NULL
,所以要检查返回的指针。 - 空间大小如果为0,
malloc
的行为未定义,取决于编辑器。
free
只能释放动态开辟的内存,参数是指向堆区的指针。- 如果参数指针为
NULL
,则函数不工作。 - 释放内存后,要将指针变量置为
NULL
,防止野指针。
typedef struct S
{
char i;
int* arr;
}S;
int main()
{
S s = {'a',NULL};
int* arr = (int*)malloc(sizeof(int) * 5);
if (arr == NULL)
{
perror("malloc");
return 1;
}
s.arr = arr;
free(s.arr);
s.arr = NULL;
return 0;
}
(二)calloc
函数
calloc
有两个参数,开辟的空间元素的个数和大小。- 会把初始空间每个字节初始化为全0。
(三)realloc
函数
- 第一个参数是需要调整的内存地址,第二个参数是调整之后的新大小。
- 返回值是调整后的内存起始位置。
- 第一种情况是:原有空间之后有足够大的空间,则追加空间,返回指针不变;第二种情况:空间之后没有足够空间,则会拷贝数据到堆上的新空间并且返回释放旧空间,返回新的指针。
- 如果参数指针是
NULL
,则其功能和malloc
一样。realloc(NULL,40)
等价于malloc(40)
。