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

栏目: C · 发布时间: 5年前

内容简介:void main(){//静态内存分配创建数组,数组的大小是固定的//int a[10];
int a[1024];

二、 C语言 内存分配

1、栈区(stack)

  • windows下,栈内存分配2M(确定的常数),超出了限制,提示 stack overflow 错误;
  • 栈区中内存自动分配,自动释放

2、堆区(heap)

  • 程序员手动分配内存,手动释放内存,占有操作系统80%的内存,通过malloc进行内存分配

    `

    //在堆内存分配40M内存

    //malloc参数是字节

    //malloc 返回值是 void

    ,是任意类型的指针

    p = malloc(1024 1024 10 * sizeof(int));

    //释放分配的内存

    free(p);

- calloc 
- realloc 重新分配内存
- 创建一个数组,动态指定数组的大小(在程序运行过程中,可以随意的开辟指定大小的内存,以供使用;相对于 Java 中的集合)

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、程序代码区

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

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

  • 很容易超出栈内存的最大值
  • 为了防止内存不够用会开辟更多的内存,容易浪费

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

  • 缩小,缩小的那部分数据会丢失
  • 扩大(连续的),如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针;如果当前内存段后面的空闲字节不够,那么久使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据释放,返回新的内存地址;如果申请失败,返回NULL,原来的指针任然有效。

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

司法的过程

司法的过程

(美)亨利·J.亚伯拉罕 / 泮伟江 宦盛奎 韩阳 / 北京大学出版社 / 2009-07-28 / 58.00元

本书是以比较研究的方法来分析司法哲学的经典文本之一。作者以敏锐的眼光透视了司法过程背后的理论、实践和参与其中的人。比较了美国、英国、法国的具体法院运作,审视了“司法能动主义”和“司法克制主义”之间的争辩。本书第七版的介绍吸收了美国、英国、法国和欧洲法院体系运作中的最新和重要的发展。 目前国内非常关注司法的运作过程、法官的裁判过程,此书的翻译对于这方面的研究很有助益,对于英国和法国法院的介绍填补了国......一起来看看 《司法的过程》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具