C语言动态申请

C语言申请动态内存

——malloc, calloc & realloc ->free

1.为什么要动态申请

由于数组在声明的时候总要显式的指定一个长度,容易造成空间浪费或者空间不够用,使用不够灵活,所以使用了动态的申请

2.使用过后记得free

动态空间与直接声明的变量不同,直接声明的变量在栈内存中,当代码块执行完毕,栈内存的变量会自动释放;但是动态申请的变量在堆内存中,代码块执行完毕后如果不手动释放这块内存,它也仍然被占用,就会引起内存泄漏

一想到动态内存,请一定要记得,动态内存使用完成后,一定要用free()函数释放

3.void *malloc(size_t size)

上面就是malloc的函数原型
参数类型size_t是一个无符号的整型,参数表示要申请内存的字节数。
返回值void *,如果申请成功,返回首地址,失败返回NULL

举例:

int *a = (int *)mallco(10 * sizeof(int))//申请一个长度为10的整型数组,记得强制类型转换
...
free(a);//释放

上面的例子有一个很糟糕的地方,就是没有判断是否申请成功,如果不成功,下面的操作有很大的可能会造成程序崩溃

//避免直接调用malloc  
#include <stdio.h>
#include <stdlib.h>
#define MALLOC(type, num) (type *)alloc(sizeof(type) * num)

void *alloc(size_t size){

    void *ptr;
    ptr = malloc(size);
    if(ptr == NULL){
        printf("内存分配失败");
    }
    return ptr;
}

4.void *calloc(sizet num, sizet element_size)

函数功能与malloc类似,有两个不同点
1. 参数不同,num是要申请多少个元素的空间,element_size是每个元素的大小,例如: (int *)calloc(10, sizeof(int));
2. calloc申请的内存会被初始化为0,有这个需求会比malloc更好用,但是,要消费更多的代价。

5.relloc(void *ptr, size_t newsize)

这个函数的作用是用来重新开辟空间,如果空间比原来的大,保留原内容; 如果空间更小,内容会被截断。

2019/3/18 12:10:39

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/88636417