动态内存分配

来源:互联网 发布:淘宝卖家人工客服 编辑:程序博客网 时间:2024/06/04 08:47
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <Windows.h>

内存分配

  • 栈区(stack)
    a. windows下,栈内存分配2M(确定的常数),超出了限制,提示stack overflow错误
    b. 自动分配,释放
  • 堆区
    程序员手动释放,操作系统80%内存
  • 全局区域或静态区
  • 字符常量区
  • 程序代码区

栈内存

void stack(){    //静态内存分配    int a[1024];//栈内存自动释放}

堆内存

void heap(){    // 40M内存    //字节    int* p = malloc(1024 * 1024 * 10 * sizeof(int));    //释放    free(p);}viod main(){    //在堆内存上,分配40M的内存    while(1){        Sleep(1000);        heap();    }    getchar();}

malloc 分配内存

  • 在程序运行过程中,可以随意的开辟指定内存的大小,相当于java中的集合
  • 静态内存分配,分配内存大小是固定的,这样很容易超出栈内存的最大值,为了防止内存不够用会开辟更多的内存,容易浪费内存
  • 动态内存分配,在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以给重新利用
void main(){    //静态内存分配创建数组,数组大小是固定的    //int a[10] []中不能写变量,比如a[i]    int len;    printf("输入数组的长度:");    scanf("%d", &len);    //开辟内存,大小是len*4字节    int* p = malloc(len * sizeof(int));    //p是数组的首地址,p就是数组的名称    //给数组元素赋值(使用这一块刚刚开辟出来的内存区域)    int i = 0;    for(; i < len; i++){        p[i] = rand % 100;        printf("%d, %#x\n", p[i], &p[i]);    }    //手动释放内存    free(p);    getchar();}

realloc 重新分配内存

void main(){    int len;    printf("请输入数组初始长度:");    scanf("%d", &len);    int *p = malloc(len * sizeof(int));    int i = 0;    for(; i < len; i ++){        p[i] = rand() % 100;        printf("%d, %#x\n", p[i], &p[i]);    }    int rlen;    printf("请输入修改后数组的长度:");    scanf("%d", &rlen);    //内存不够用,扩大刚刚分配的内存空间    //1.原来内存的指针 2.内存扩大后的总大小    int* p2 = realloc(p, sizeof(int) * (len + rlen));    if(p2 == NULL){        printf("内存重新分配失败");    }    //内存重新分配的两种情况    //缩小, 缩小的那一部分数据会丢失    //扩大(连续的)    //1.如果当前内存段后面有需要的内存空间,直接拓展这段内存空间,realloc返回原指针    //2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址    //3.如果申请失败,返回NULL,原来的指针仍然有效    //重新赋值    if(p2 != NULL){        i = 0;        for(; i < len + rlen; 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();}

内存分配的几个注意细节

  • 不能多次释放
  • 释放完毕后(指针仍然有值),给指针置NULL,标志释放完成
  • 内存泄漏(p重新赋值后,再free,并没有真正释放内存)
void main(){    int len;    printf("请输入数组的长度:");    scanf("%d", &len);    int *p = malloc(len * sizeof(int));    int i = 0;    for(; i < len; i++){        p[i] = rand() % 100;        printf("%d, %#x\n", p[i], &p[i]);    }    if(p != NULL){        free(p);        p = NULL;    }    getchar();}
void main(){    //40M    int* p1 = malloc(1024 * 1024 * 10 * sizeof(int));    free(p1);    p1 = NULL;    printf("%#x\n", p1);    //80M    p1 = malloc(1024 * 1024 * 10 * sizeof(int) * 2);    fredd(p1);    p1 = NULL;    getchar();}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五个月的宝宝拉肚子还拉水怎么办 4岁宝宝拉肚子怎么办拉水样 刚出生的婴儿呕奶怎么办 8岁儿童腹泻呕吐怎么办 一岁宝宝呕吐腹泻怎么办 5岁儿童腹泻呕吐怎么办 4岁宝宝呕吐腹泻怎么办 7岁儿童腹泻呕吐怎么办 一个月婴儿呕奶怎么办 一个月婴儿呕奶严重怎么办 6岁宝宝大便干燥怎么办 3岁儿童干咳嗽怎么办 3岁宝宝一直咳嗽怎么办 3岁宝宝风寒咳嗽怎么办 刚出生的宝宝拉奶瓣怎么办 小孩拉痢疾带血怎么办 2岁宝宝有点拉稀怎么办 1岁宝宝有点拉稀怎么办 3岁宝宝有点拉稀怎么办 甲减粘液性水肿怎么办 五个月宝宝断奶不吃奶粉怎么办 八个半月的宝宝不爱吃饭怎么办 十个半月宝宝不爱吃饭怎么办 九个半月宝宝不爱吃饭怎么办 七个半月宝宝不爱吃饭怎么办 8个半月宝宝不爱吃饭怎么办 八个半月宝宝不爱吃饭怎么办 特百惠杯子摔坏后不给换怎么办 特百惠水杯摔裂了怎么办 焖烧杯摔瘪了怎么办 苦瓜和虾一起吃中毒怎么办 乐扣盖子坏了怎么办 小孩上课坐不住好动怎么办 5小孩晚上不睡觉怎么办 一年级的孩子上课好动怎么办 一岁宝宝太好动怎么办 3岁宝宝太好动怎么办 孩子学习注意力不集中怎么办 1岁宝宝皮肤黄怎么办 三岁宝宝太皮怎么办 一岁宝宝太皮了怎么办