使用场景
动态分配数组: 当需要在程序运行时动态地创建一个数组时,可以使用malloc函数来分配所需大小的内存空间。例如,当需要读取未知数量的数据时,可以先使用malloc分配足够的内存空间,然后逐个读取数据并存储在该数组中。
动态创建结构体: 当需要在程序运行时动态创建一个结构体对象时,可以使用malloc函数来为结构体分配内存空间。这样可以灵活地根据需要创建和释放结构体对象,而不受固定大小的限制。
动态分配字符串: 当需要在程序运行时动态分配字符串时,可以使用malloc函数来为字符串分配足够的内存空间。这样可以根据字符串的长度来动态分配内存,避免了固定长度字符串的限制。
实现动态数据结构: 在实现动态数据结构(如链表、树等)时,malloc函数可以用于动态分配节点的内存空间。这样可以根据需要创建和释放节点,使数据结构具有灵活性和扩展性。
正确地使用malloc
头文件:
#include <stdlib.h>
malloc的原始函数:
// void* 是其类型。num_bytes是要开辟内存的大小
extern void *malloc(unsigned int num_bytes);
例子:
int *p = (int*)malloc(sizeof(int));
注意事项
1、数据类型要强制转换
从原始函数可知,其原始类型为(void*)。void*类型是不能给其他数据类型赋值的。所以我们要继续强制转换。如上例中,我们使用(int *)进行强制类型转换
2、要判断malloc有没有成功开辟内存空间
当malloc函数成功开辟内存后,会返回对应的指针。要是内存空间不够大,内存开启失败,会返回NULL.
int *p = (int*)malloc(sizeof(int));
if(p == NULL){
perror("malloc failed");
exit(1);
}
3、要对数据进行初始化
在使用malloc分配内存后,可以使用memset函数将分配的内存空间初始化为零。这样可以确保分配的内存空间中的数据是初始值,而不是随机值。
4、内存空间使用完成后,要释放空间
堆区开辟的内存空间,编译器是不会自动回收。需要开发者自己回收。可以使用free()。
注意:使用free函数释放结构体的时候,并没有释放结构体内的指针。结构体内的指针要单独free。
如下例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct person {
int age;
char *name;
};
int main() {
struct person *p = (struct person *)malloc(sizeof(struct person));
if (p == NULL) {
perror("malloc");
exit(1);
}
memset(p, 0, sizeof(struct person));
p->age = 18;
p->name = (char *)malloc(sizeof(char) * 20);
char *name = "jerry";
strcpy(p->name, name);
printf("p->name: %s\n", p->name);
free(p->name);
free(p);
return 0;
}