大家都知道在c语言的运行过程中,局部变量都是存放在栈中的,且是从高位到低位进行进行空间分配。

先看一个程序。



很明显,地址从高到低分配,和预计的一样。

稍微修改一下,再运行。




很明显,从低位到高位!!!

明确一下问题:栈区会应为局部变量的占内存的大小更改内存的分配方式。

为什么?为什么?为什么?


用-S生成汇编语言看一下

第一种情况的汇编语言

 .file   "main.c".section  .rodata
.LC0:.string    "Address s = Ox%x\n"
.LC1:.string    "Address d = Ox%x\n".text.globl  main.type   main, @function
main:
.LFB0:.cfi_startprocpushl   %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl  %esp, %ebp.cfi_def_cfa_register 5andl   $-16, %espsubl  $32, %espmovl   %gs:20, %eaxmovl    %eax, 28(%esp)xorl  %eax, %eaxmovl  $6513249, 24(%esp)movw  $25185, 21(%esp)movb    $0, 23(%esp)leal    24(%esp), %eaxmovl  %eax, 4(%esp)movl   $.LC0, (%esp)call   printfleal  21(%esp), %eaxmovl  %eax, 4(%esp)movl   $.LC1, (%esp)call   printfmovl  $1, %eaxmovl    28(%esp), %edxxorl  %gs:20, %edxje  .L3call __stack_chk_fail
.L3:leave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
.LFE0:.size main, .-main.ident  "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3".section   .note.GNU-stack,"",@progbits


第二种情况的汇编语言

 .file   "main.c".section  .rodata
.LC0:.string    "Address s = Ox%x\n"
.LC1:.string    "Address d = Ox%x\n".text.globl  main.type   main, @function
main:
.LFB0:.cfi_startprocpushl   %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl  %esp, %ebp.cfi_def_cfa_register 5andl   $-16, %espsubl  $32, %espmovl   %gs:20, %eaxmovl    %eax, 28(%esp)xorl  %eax, %eaxmovl  $6513249, 17(%esp)movl  $1684234849, 21(%esp)movw   $26213, 25(%esp)movb    $0, 27(%esp)leal    17(%esp), %eaxmovl  %eax, 4(%esp)movl   $.LC0, (%esp)call   printfleal  21(%esp), %eaxmovl  %eax, 4(%esp)movl   $.LC1, (%esp)call   printfmovl  $1, %eaxmovl    28(%esp), %edxxorl  %gs:20, %edxje  .L3call __stack_chk_fail
.L3:leave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc
.LFE0:.size main, .-main.ident  "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3".section   .note.GNU-stack,"",@progbits

在前面的几句mov有很明显的不同,一个是从低到高分配,一个是从高到低分配.

猜想:编译器对语言进行的优化,让长的字符串先进栈。

但为什么要这么做呢?

求解答。

本文转载自:http://blog.csdn.net/qp120291570/article/details/8889950

C语言中自动变量栈的分配相关推荐

  1. c语言根据变量作用域不同分为,C语言中不同变量的访问方式

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期.一 ...

  2. c语言中栈堆,全程剖析C语言中堆和栈的区别

    C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...

  3. C语言中堆、栈、队列

    C语言中堆.栈和队列: 1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱 ...

  4. ADS下C语言中局部变量的存储位置分配

    ADS下C语言中局部变量的存储位置分配 发布:xlander | 发布时间: 2008年8月12日 做研发很多年了,起初开发的软件都是在台式机上运行的,台式机上丰富的资源从来没让我仔细的思考过有关变量 ...

  5. c语言中外部变量的使用方法,C语言外部变量的使用以及erxtern的用法

    网上有很多帖子问C语言中extern的用法,而且回答的详细程度各尽不同. 所以我就像写一篇博文来谈谈我对extern的看法,不一定十分恰当,只当大家共勉. 变量定义性声明和引用性声明 变量的声明有两种 ...

  6. r语言 分类变量 虚拟变量_R语言中的变量

    r语言 分类变量 虚拟变量 R语言| 变数 (R Language | Variables) In the previous tutorial, we have come across the bas ...

  7. 在c语言中 使用变量的要求,关于C语言中变量的探讨

    摘 要: 在所有的计算机高级语言中,都存在着变量这样一个重要的概念.变量是计算机高级语言程序的重要成分之一.与其他语言中的变量相比,C语言中的变量所包含的内容更为丰富,包括变量的定义.数据类型.变量数 ...

  8. C语言中自动获取当前时间和日期

    C语言中自动获取当前时间和日期代码 #include<stdio.h> #include<time.h> void main() {time_t t;//将t声明为时间变量st ...

  9. C语言中静态变量的概念和用法

    1.什么是静态变量 C语言中的静态变量是指被static关键字修饰的变量.静态变量有两种类型,一种是定义在全局变量上的全局静态变量,另一种是定义在局部变量上的局部静态变量.Static可以用来修饰变量 ...

最新文章

  1. c#_关键字base
  2. Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集
  3. Java引用类型有哪些
  4. 内嵌iframe_内嵌页面session超时,内嵌页面显示登录界面问题解决方案
  5. TypeScript 交叉类型(intersection type)
  6. 1x1 11b g n linux,基于RN1810下的2.4 GHz IEEE 802.11b/g/n无线模块
  7. mysql字符集解释_MySQL字符集详解
  8. 常见的UI设计素材模板
  9. Web前端工作笔记004---js--webSocket简单介绍和使用方法
  10. 老是说我编译版本不够_编译etcd出现的cannot load bufio的错误解决办法
  11. recvfrom函数 非阻塞_那些年让你迷惑的阻塞、非阻塞、异步、同步
  12. php 数组任意位置插入值
  13. iometer - 性能压力测试工具
  14. 无线路由器密码破解最新教程完整版
  15. gitlab中创建项目组及项目
  16. android ui 扁平化,为何UI集体变风格 扁平化是未来主流吗?
  17. 天猫自营和京东自营的区别
  18. 全球媒体网关行业收入预计2028年达到19.442亿美元
  19. java 使用相对路径读取文件
  20. 有意思的轨道交通线路图相关网站

热门文章

  1. SAP R3 在windows XP下 安装成功心得分享
  2. LIst和map的遍历
  3. clojure 中使用 actor
  4. CentOS7安装iptables防火墙
  5. Mybatis --- SelectKey
  6. [JS]格式化Date和分析格式化Date字符串的JS代码
  7. shiro+redis实现session共享
  8. Linux命令之乐--expr
  9. Linux下如何查看哪些端口处于监听状态
  10. 时代亿信 认证墙-SID强身份认证产品