C、C++ 动态分配内存 malloc calloc reall

2023-06-28  本文已影响0人  Kael_Zhang的安卓笔记

为什么动态分配内存?

int a[5]; //ok
int length = 5;
int a[length];  //不ok

动态分配内存的使用

int *p = (int *)malloc(10); //动态申请10个字节的大小的连续空间,返回的是首地址
int *p = (int *)calloc(10,2); //动态申请 10*2 个字节的大小的连续空间,并初始化为0,返回的是首地址
int *p = (int *)malloc(20 * sizeof(int));
int *p1 = (int *)realloc(p, 10*sizeof(int)); 
//扩大已分配的内存,返回已扩大后的新分配的连续空间的首地址,同时将扩大之前的地址中的值复制到新地址中

动态分配内存的释放

# include <stdio.h>
# include <stdlib.h>
int main(void)
{
    int *p = malloc(sizeof(int));
    *p = 10;
    printf("p = %p\n", p);
    free(p);
    printf("p = %p\n", p);
    p = NULL;
    return 0;
}

释放前后,p 所指向的内存地址是一样的。所以释放后 p 所指向的仍然是那块内存空间。既然指向的仍然是那块内存空间,那么就仍然可以往里面写数据。可是释放后该内存空间已经不属于它了,该内存空间可能会被分配给其他变量使用。如果其他变量在里面存放了值,而现在用 p 往里面写入数据就会把那个值给覆盖,这样就会造成程序错误。所以当指针变量被释放后,要立刻把它的指向改为 NULL。

上一篇 下一篇

猜你喜欢

热点阅读