c语言:13.5、动态内存分配指针

Source

1、malloc

在堆内存中分配指定的空间,需要手动释放。

#include <stdlib.h>
int main(){
    
      
    int *p = malloc(sizeof(int));
    free(p);
    return 0;
}

2、calloc

calloc和malloc很类似,但是会默认将指针的值进行初始化

int main(){
    
      
    #define ARR_LEN 3
    int *p = calloc(ARR_LEN, sizeof(int));
    PRINT_INT_ARRAY(p,ARR_LEN);
    free(p);
    return 0;
}

运行结果如下:
在这里插入图片描述

3、realloc

可以使已分配的内存变长

int main(){
    
      
    #define ARR_LEN 3
    int *p = calloc(ARR_LEN, sizeof(int));
    PRINT_INT_ARRAY(p,ARR_LEN);
    for(int i=0; i<ARR_LEN; i++){
    
      
        p[i] = i;
    }
    PRINT_INT_ARRAY(p, ARR_LEN);
    realloc(p, ARR_LEN * 2 * sizeof(int));
    PRINT_INT_ARRAY(p,ARR_LEN * 2);
    free(p);
    return 0;
}

在这里插入图片描述

4、注意

在分配内存的时候极有可能会分配失败,在写demo时内存肯定是充足的,但是个别情况比如写嵌入式程序时,内存有限。因此最好是将返回值做一个判断。

#define ARR_LEN 3
int *p = calloc(ARR_LEN, sizeof(int));
if(p == NULL){
    
      
    //异常处理
}

5、常见分配内存指针使用错误

1、忘记使用完毕后释放内存
2、使用了已经释放的内存
3、使用了超出边界的内存
4、给指针分配内存后,改变指针的内存指向,导致无法正常释放

6、动态内存使用建议

1、避免修改指向已分配的内存指针
2、对于free之后的指针主动置为NULL
3、避免将过多的指针指向动态分配的内存
4、动态内存遵从谁分配谁释放的原则