面试题答案
一键面试常见动态内存分配函数
malloc
:- 函数原型:
void *malloc(size_t size);
- 功能:分配指定字节数的内存空间。返回一个指向分配内存起始地址的指针,如果分配失败则返回
NULL
。
- 函数原型:
calloc
:- 函数原型:
void *calloc(size_t nmemb, size_t size);
- 功能:分配
nmemb
个长度为size
字节的连续内存空间,并将所有字节初始化为0
。返回一个指向分配内存起始地址的指针,如果分配失败则返回NULL
。
- 函数原型:
realloc
:- 函数原型:
void *realloc(void *ptr, size_t size);
- 功能:重新分配
ptr
所指向的内存块的大小为size
字节。如果ptr
为NULL
,则相当于调用malloc(size)
;如果size
为0
,且ptr
不为NULL
,则相当于调用free(ptr)
并返回NULL
。返回一个指向重新分配内存起始地址的指针,如果分配失败则返回NULL
。
- 函数原型:
使用时注意事项及避免内存泄漏方法
- 检查返回值:每次调用动态内存分配函数后,都要检查返回值是否为
NULL
,以判断分配是否成功。如果返回NULL
,应采取适当的错误处理措施,如输出错误信息并终止程序。 - 释放内存:使用完动态分配的内存后,必须调用
free
函数释放内存,以避免内存泄漏。free
函数的原型为void free(void *ptr);
,其中ptr
必须是之前通过malloc
、calloc
或realloc
分配得到的指针。 - 避免多次释放:确保不要对同一个指针多次调用
free
函数,这会导致未定义行为。可以在调用free
后将指针设置为NULL
,以防止意外再次释放。 - 匹配内存分配和释放:对于每一个动态内存分配函数(
malloc
、calloc
、realloc
),都要有对应的free
调用,并且要保证释放的指针是正确的。
示例代码
#include <stdio.h>
#include <stdlib.h>
int main() {
// 使用malloc分配内存
int *ptr1 = (int *)malloc(5 * sizeof(int));
if (ptr1 == NULL) {
perror("malloc");
return 1;
}
// 使用calloc分配内存
int *ptr2 = (int *)calloc(5, sizeof(int));
if (ptr2 == NULL) {
perror("calloc");
free(ptr1);
return 1;
}
// 使用realloc调整内存大小
int *ptr3 = (int *)realloc(ptr1, 10 * sizeof(int));
if (ptr3 == NULL) {
perror("realloc");
free(ptr1);
free(ptr2);
return 1;
}
ptr1 = ptr3; // 更新指针
// 使用完后释放内存
free(ptr1);
free(ptr2);
return 0;
}
在上述代码中,通过malloc
、calloc
和realloc
分配内存,并在使用后正确释放内存,避免了内存泄漏。同时,在每次分配内存后检查返回值,以确保内存分配成功。