C动态内存开辟(malloc,realloc,calloc)

C函数库提供了malloc()和free()用于执行动态内存分配和释放。这些函数维护了一个内存池,当程序另外需要一些内存时,就调用malloc函数,malloc从内存池中提取一块合适且连续的内存。但是开辟的内存是没有进行初始化的,需要手动初始化;当一块以前分配的内存不再使用时,程旭辉调用free函数把它归还给内存池以供以后使用。

malloc函数原型:
void* malloc(size_t size);
malloc函数分配内存的时候,如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针;
当内存池为空或者它的可用内存无法满足你的需求,malloc函数向操作系统请求,要求更多的内存,并在这块心内存上执行分配任务,如果操作系统无法提供更多的内存,malloc就会返回一个NULL指针。因此,对每个从malloc返回的指针都进行检查,确保它并非NULL;
malloc返回一个类型为void*的指针,标准表示一个void*类型的指针可以转换为其他任何类型的指针。

free函数原型
void free(void *pointer);
传递的参数是一个从malloc,calloc,realloc返回的指针,向free函数传递一个NULL并不会产生任何效果。
calloc函数原型
void *calloc(size_t num_elements,size_t elements_size);
calloc函数的参数包括所需元素的数量和每个元素的字节数,并在返回指针之前把它初始化为0.
realloc函数原型
void realloc(void *ptr,size_t new_size)
realloc函数用于修改一个原先已经分配的内存块的大小;
使用这个函数可以使一块内存扩大或缩小;如果用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方式初始化;如果用于缩小一块内存,该内存块尾部的部分内存便被拿掉,剩余部分内存的原来内容依然保留。
如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先内存的内容复制到新的块伤,使用realloc返回的新的指针。
如果realloc函数的第一个参数为NULL,他的行为和malloc一样。

char *p1 = (char*)malloc(12);
    printf("p1:%x\n", p1);
    char* q1 = p1;
    q1 = (char*)realloc(p1, 8);
    printf("q1:%x\n", q1);

    printf("\n\n");

    char *p = (char*)malloc(12);
    printf("p:%x\n", p);
    char* q = p;
    q = (char*)realloc(p, 800);
    printf("q:%x\n", q);

    printf("\n\n");

    char* x = (char*)calloc(5, 2);
    printf("x:%x\n", x);

这里写图片描述

动态内存分配的程序中出现的错误
对NULL指针进行解引用操作;
对分配的内存进行操作时越界;
释放并非动态分配的内存;
试图释放一块动态分配的内存的一部分;
一块动态内存被释放之后被继续使用。

猜你喜欢

转载自blog.csdn.net/qq_39295755/article/details/81030654