在编程中,内存分为五大分区:栈区内存,堆区,静态区,常量区,代码区.

看下面一个函数,你能发现它又什么问题?又该如何改正?

char * getString() {

char str[20] = "iPhone";

return str;

}

首先,我们先来了解下五大分区的作用,然后上面的getString()函数的错误,就迎刃而解了.

栈区内存:是给函数里面的局部变量和形参分配内存.当发生函数调用时,操作系统就会为这个函数里面的所有局部变量和形参分配内存, 当函数调用完毕时, 所有为这个函数分配的栈区内存就会被系统回收.

堆区:由程序员自己负责分配和释放. 有分配就得有释放, 否则会导致内存泄露

静态区:用static修饰的变量和全局变量会被分配在静态区,静态区内存由操作系统负责分配和释放(并且使用static修饰的变量只会被初始化一次)

常量区:代码里写的数值常量,字符串常量,都是存储在常量区的,常量区的内存也是操作系统负责分配和释放.常量区的最大特点是内容不可修改.

我们已经了解了五大分区每个分区的特性,那么接下来,我们来分析一下getString()函数错在哪里?

在getString函数中:char str[20]=

"iPhone";定义了一个长度为20的字符数组,因为是函数里面的局部变量,因此它的内存是在栈区存放,也就是说,现在栈区里面申请了一块内存区域用来存放getString函数里面的局部变量,"iPhone"这个字符数组也就保存在了这个栈区内存.

接下来return str;返回数组的地址.函数调用结束后,系统将会对栈区的getString的内存进行回收.也就是说,返回的str这个指针指向数组已经不存在了.那么我们该如何改进才能拿到这个"iPhone"字符数组呢?

这就需要利用堆区的特性来进行改进.改进后函数如下:

char * getString() {

char * str = malloc(10) ;//动态申请一个堆区内存,来存储字符

strcpy(str , "iPhone");//把常量区的"iPhone"字符拷贝到堆区的内存中

return str;//返回的是堆区的地址

}

通过这样改进后我们就能拿到一个指向堆区的指针.(调用过这个函数后,要记得释放free(); )

如果你在学习C/C++的过程中遇到了问题,可以来加入小编的企鹅圈问小编哦~小编很热情的(●’◡’●)

char * getString() {

char str[20] = "iPhone";

return str;

}

C/C++学习日记:C语言栈区与堆区浅谈相关推荐

  1. OC中栈区与堆区的内存概念解析

    栈区是先进后出,队列是先进先出. 栈区就相当于玻璃杯,往玻璃杯里放奥利奥,第一块放入的奥利奥,肯定是最后一个拿出来. 队列就相当于掉了底的玻璃杯,最先放入的,必定最先掉出来. 网上有个更绝的比喻:队列 ...

  2. 一条进程的栈区、堆区、数据区和代码区在内存中的映射

    一条进程的栈区.堆区.数据区和代码区在内存中的映射     1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址..esp 始终指向栈顶, 栈中的数据越多, esp的值越小.    ...

  3. C语言内存分配-附图详解,代码区、常量区、栈区、堆区.......

    文章目录 C语言程序的内存组成 变量以及数组开辟内存空间地址大小问题 C语言程序的内存组成 不管对于那种编程语言而言,内存管理都十分重要.对于C语言程序来说,所占用的内存主要有以下几个部分:代码区(所 ...

  4. 栈区和堆区内存分配区别

    一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上 ...

  5. 栈区,堆区,全局区,文字常量区,程序代码区详解(程序中不同类型数据所在区)

    一.预备知识-程序的内存分配     一个由C/C++编译的程序占用的内存分为以下几个部分     1.栈区(stack)-   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其   ...

  6. C语言除法浮点型和整形,浅谈C语言整型与浮点型转换

    本篇博客将阐述.讨论的内容: ●int int的范围根据计算机的不同存在16位或32位的差异,以16位举例,最大值为1111 1111 1111 1111,也就是65535,如果出现65536,就会溢 ...

  7. python语言源程序文件类型_浅谈Python的文件类型

    Python的文件类型主要分为3种:源代码(source file).字节码(byte-code file).优化的字节码(optimized file).这些代码都可以直接运行,不需要编译或者连接. ...

  8. 嵌入式c语言如何在堆区开辟空间

    堆区是动态内存分配的一个重要区域,在C语言中可以使用malloc()函数在堆区开辟空间.malloc()函数的语法如下: void *malloc(size_t size); 其中,size是您需要开 ...

  9. 二级C语言上机考试评分标准,浅谈二级C语言上机考试评分原理

    浅谈二级C语言上机考试评分原理 C语言的表现能力和处理能力极强.它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构.下面是小编整理的关于二级C语言上机考试评分原理,希望大家认真阅读! 上机考 ...

最新文章

  1. [导入]几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比
  2. android音乐编辑器汉化版,WaveEditor手机版
  3. 计算机360浏览器的大小,360安全浏览器8.1电脑正式版
  4. Pytorch基础(九)——损失函数
  5. java sqlserver 死锁_sqlserver数据库发生死锁处理
  6. 前端学习(294):rem小实例
  7. PHP在金山游戏运营中的应用
  8. o oia ospf 路由优先_CCNP理论之OSPF协议(二)
  9. 轻量小巧的Knife4j v2.0.8源码
  10. jQuery1.2选择器(1)
  11. mysql1558错误,mysql删除用户错误ERROR 1558解决办法
  12. python mvc框架django搭建项目_Django笔记1:基础:创建虚拟主机和新项目
  13. c语言opengles程序,OpenGL教程 OpenGL编程指南
  14. abaqus 不收敛问题
  15. oppor9splus科学计算机,oppo r9s plus手机驱动
  16. python阈值计算_基于Python的阈值分割算法实现(二)
  17. Agile Scrum WaterFall通俗易懂的全过程整理
  18. 使用gltf-pipeline转换gltf、glb模型文件
  19. 前端网页设计内容二《电商平台网站》
  20. linux中的wget命令

热门文章

  1. camunda modeler 汉化方法
  2. 外贸、财务相关名词解释
  3. 155_模型_Power BI Power Pivot 进销存之安全库存
  4. 2022年信息学部物联网工程学院学生科协机器学习科普
  5. 【无标题】unity人脸融合API Face++
  6. amos不显示路径系数原因
  7. CCA OBSS/PD
  8. Python V-ing 变化小程序
  9. 用HTML+CSS跟简单的js操作完成响应式星巴克首页
  10. Py之py2neo:py2neo的简介、安装、使用方法之详细攻略