malloc的用法简述

使用场景

动态分配数组: 当需要在程序运行时动态地创建一个数组时,可以使用malloc函数来分配所需大小的内存空间。例如,当需要读取未知数量的数据时,可以先使用malloc分配足够的内存空间,然后逐个读取数据并存储在该数组中。

动态创建结构体: 当需要在程序运行时动态创建一个结构体对象时,可以使用malloc函数来为结构体分配内存空间。这样可以灵活地根据需要创建和释放结构体对象,而不受固定大小的限制。

动态分配字符串: 当需要在程序运行时动态分配字符串时,可以使用malloc函数来为字符串分配足够的内存空间。这样可以根据字符串的长度来动态分配内存,避免了固定长度字符串的限制。

实现动态数据结构: 在实现动态数据结构(如链表、树等)时,malloc函数可以用于动态分配节点的内存空间。这样可以根据需要创建和释放节点,使数据结构具有灵活性和扩展性。

正确地使用malloc

头文件:

#include 

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 
#include 
#include 

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;
}

你可能感兴趣的:(c语言,c++)