Android/NDK开发C/C++C语言

(二)C语言之动态内存分配

2019-03-06  本文已影响29人  onestravel

(二)C语言之动态内存分配

一、静态内存分配

定义是指定分配的内存长度就是静态内存分配,是在栈内存中分配

int a[1024];

二、C语言内存分配

1、栈区(stack)

2、堆区(heap)

//在堆内存分配40M内存
//malloc参数是字节
//malloc 返回值是 void * ,是任意类型的指针
int* p = malloc(1024 * 1024 * 10 * sizeof(int));
//释放分配的内存
free(p);

void main(){
    //静态内存分配创建数组,数组的大小是固定的
    //int a[10];
    
    int len;
    printf("输入数组的长度:");
    scanf("%d",&len);
    //开辟内存
    int* p = malloc(len * sizeof(int));
    //p是数组的首地址
    //给数组元素赋值(使用这一块刚刚开辟出来的内存区域)
    int i = 0;
    for(;i < len; i++){
        p[i] = rand() % 100;
        printf("%d,%#x\n",p[i],&p[i]);
    }
    //扩大刚刚分配的内存空间
    printf("重新输入数组的长度:");
    scanf("%d",&len);
    //参数说明
    //1:原来的内存的指针
    //2:内存扩大之后的总大小
    int* p2 = realloc(p,sizeof(int) * len);
    //重新赋值
    i = 0;
    for(;i < len; i++){
        p2[i] = rand() % 200;
        printf("%d,%#x\n",p2[i],&p2[i]);
    }
    //手动释放内存
    if(p != NULL){
        free(p);
        p = NULL;
    }
     if(p2 != NULL){
        free(p2);
        p2 = NULL;
    }
    
    getchar();
}

输入结果为(参考):

输入数组的长度:6
41,0x202330
67,0x202334
34,0x202338
0,0x20233c
69,0x202340
24,0x202344

3、全局区或静态区

4、字符常量

5、程序代码区

三、静态内存分配与动态内存分配的区别

静态内存分配,分配内存大小是固定的;容易出现以下问题:

动态内存分配,在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以被重新使用;容易出现以下问题:

四、内存分配的几个注意细节

  1. 不能多次释放
  2. 释放完之后,给指针置为NULL
  3. 内存泄漏(p重载赋值之后,在free,并没有真正释放内存)
上一篇下一篇

猜你喜欢

热点阅读