接上篇内存四区的堆区的总结,下面做一些栈区的相关总结。

一、栈区的分析:

就下面测试程序

#include "stdio.h"
#include "string.h"
char *getMem()
{
char buf[]; strcpy(buf, "aabbccdd"); return buf;
}
int main(int argc, const char **argv)
{
char *tmp = NULL;
tmp = getMem2();
printf("tmp = %s\r\n", tmp);
return ;
}
先进行程序的编译,会出现如下的警告:
​图1 编译警告说明示意图

警告说明的是返回局部变量或者临时变量的地址,暂时不管他,直接运行后出现效果:

​图2 运行的效果图

进行分析可知道其中的原委:

上面的程序,在getMem函数中,在栈区分配128字节的内存空间,在函数执行完毕返回后,将buf析构掉(浅粉色表示),并且,buf做指向的内存空间也被析构(灰色表示)。

其内存四区表示可以简单如图所示:

​图3 程序运行的内存四区的变化的模型示意图​​​​​

所以,在打印的时候出现不认识的东西,就是由于上述原因造成的。

二、堆栈的属性

1、栈的开口方向的测试(先进后出的特性)

可以简单的进行测试,首先假设一个虚拟的方向轴,那么,在图3所示的效果中,左边的栈一代表开口方向向下,右边栈二代表开口方向向上,那么,根据先进后出的特性,如果b的地址小,那说明栈的开口方向向下。

​图4 栈的开口方向的测试示意图

那么可以用下面的简单程序进行测试:

#include <stdio.h>

int main(int argc, const char **argv)
{
int a;
int b; printf("&a = %p, &b = %p\r\n", &a, &b);
return ;
}
编译运行后,可以看出来,a的地址为0060FF2C,大于b的地址0060FF28,那说明栈的开口方向是向下的。

其实在一般情况下,默认认为栈的开口向下的,主要是因为:每个应用程序的栈,如果提前把栈的最大值定义好,在程序逐渐入栈的过程中,栈的地址越来越小,避免栈的溢出。

​图5 运行效果图

2、栈的属性和内存块的地址增长方向是不同的概念

比如下面的测试程序。

#include <stdio.h>
int main(int argc, const char **argv)
{
char buf[]; printf("buf = %p, buf + 1 = %p\r\n", buf, buf + );
return ;
}

​图6 内存块在栈区的示意图

如果buf指针指向绿色的位置,那么在进行buf+1运算的时候,指针就会跑到栈的外面去了,这不应该的出现的效果呀。和我们实际需要的buf+1的效果不一致。所以,不管栈的开口方向如何,内存块(buf)的内存空间的生长方向都是向上的。

运行我们的程序可以看出来:

​图7 运行的效果图

三、简单总结

1、拷贝指的是向指针指向的内存空间拷贝,而不是向指针变量中拷贝

2、程序返回的是指针的内存的首地址,而不是整个内存空间

3、一般情况下,默认认为栈的开口向下的

4、栈的属性和内存块的地址增长方向是不同的概念

C语言内存四区的学习总结(三)---- 栈区的更多相关文章

  1. C语言内存四区的学习总结(一)---- 静态区

    最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...

  2. C语言内存四区的学习总结(二)---- 堆区

    接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...

  3. C语言内存四区

    按照老版操作系统来学习,内存对于程序来讲分四区.分别是 代码区,静态区,栈,堆. 由上面程序执行的结果可知: 貌似结果就是 静态代码堆栈 静态区存放的是程序中所有静态变量和常量的值.静态区的大小是程序 ...

  4. c语言内存四区、数据存储范围和内存存储方向

    (1)代码区通常是共享只读(代码无法修改)的,即可以被其他的程序调用,例如运行两个qq,除了数据不一样,代码都是一样的, 每次运行qq,都会将代码和数据加载到内存中,除了数据,每次加载的代码都是一样的 ...

  5. C语言提高 (1) 第一天 数据类型本质与内存四区

    (物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...

  6. 深入理解C语言-深入理解内存四区

    数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...

  7. C语言进阶之路(一)----C语言的内存四区模型

    内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...

  8. C语言之内存四区模型和函数调用模型

      内存四区模型 流程说明1.操作系统把物理硬盘代码load到内存2.操作系统把c代码分成四个区3.操作系统找到main函数入口执行 1.内存四区: 一个由c/C++编译的程序占用的内存分为以下几个部 ...

  9. C语言的内存四区模型和函数调用模型

    首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...

随机推荐

  1. 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

    警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/4 ...

  2. 安装Python的numpy库

    1. 检查是否有pip.exe, 如果没有,可以到 https://pypi.org/project/pip/#files下载 2. 安装好pip后,在安装numpy之前,查看是否安装成功,pip - ...

  3. php使用coreseek进行中文分词搜索

    方法一 使用coreseek源码自带testpack/api/test_coreseek.php代码,进行稍微修改就可以使用了,只不过需要引入”spinxapi.php“类 方法二--制作php扩展 ...

  4. 微信自带浏览器不支持form表单post提交方案解决

      微信自带浏览器form表单post提交,Java控制后台获取不到值得解决方案: 第一种:把post改成get请求,但是改后另一个问题来了就是,数据不安全了,连接上都能看到,导致数据会流失,Java ...

  5. o2o、c2c、b2c、b2b、b2b2c都是什么?

    o2o:线上线下,如线上消费,线下享受服务,o2o是不需要物流的,是线上购买的东西,自己去线下获得.c2c:个人对个人,消费者与消费者之间的小成本交易,买卖双方都不是公司,如你在咸鱼上卖自己的东西.b ...

  6. python入门(十二):面向对象

    1.场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物出现在屏幕的地点. 可以使用字典来进行记录: {&quo ...

  7. MySQL编码不一致导致查询结果为空

    升级数据库后(5.1到8.0),发现一个奇怪的问题,某些页面在升级前可以正常查询,但升级后什么也查不出来了,有时候还会查出错误的结果.经过一整天的排查,终于发现由两个原因导致,现记录如下. 第一是数据 ...

  8. 大数据入门到精通15--hive 对 date类型的处理

    一.基础日期处理 //date 日期处理select current_date;select current_timestamp;//to_date(time) ;to_date(string)sel ...

  9. ASCII,Unicode,GBK和UTF-8字符编码的区别和联系

    如果经常写python2,肯定会遇到各种“奇怪”的字符编码问题,每次都通过谷歌解决了,但是为什么会造成这种乱码.decode/encode失败等等,本文就字符和字符编码做一个总结,更加清晰区分诸多的编 ...

  10. step_by_step_CSRF/ XSRF_问题描述

    接触Asp.net boilerplate 一段时间,一次同事将他的代码添加到zero项目模板中,他将路由配置成他的页面,目的是要让zero项目登录成功之后跳转到他的页面,可是通过fiddler监视请 ...