C语言中自动变量栈的分配
大家都知道在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语言中自动变量栈的分配相关推荐
- c语言根据变量作用域不同分为,C语言中不同变量的访问方式
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期.一 ...
- c语言中栈堆,全程剖析C语言中堆和栈的区别
C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...
- C语言中堆、栈、队列
C语言中堆.栈和队列: 1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱 ...
- ADS下C语言中局部变量的存储位置分配
ADS下C语言中局部变量的存储位置分配 发布:xlander | 发布时间: 2008年8月12日 做研发很多年了,起初开发的软件都是在台式机上运行的,台式机上丰富的资源从来没让我仔细的思考过有关变量 ...
- c语言中外部变量的使用方法,C语言外部变量的使用以及erxtern的用法
网上有很多帖子问C语言中extern的用法,而且回答的详细程度各尽不同. 所以我就像写一篇博文来谈谈我对extern的看法,不一定十分恰当,只当大家共勉. 变量定义性声明和引用性声明 变量的声明有两种 ...
- r语言 分类变量 虚拟变量_R语言中的变量
r语言 分类变量 虚拟变量 R语言| 变数 (R Language | Variables) In the previous tutorial, we have come across the bas ...
- 在c语言中 使用变量的要求,关于C语言中变量的探讨
摘 要: 在所有的计算机高级语言中,都存在着变量这样一个重要的概念.变量是计算机高级语言程序的重要成分之一.与其他语言中的变量相比,C语言中的变量所包含的内容更为丰富,包括变量的定义.数据类型.变量数 ...
- C语言中自动获取当前时间和日期
C语言中自动获取当前时间和日期代码 #include<stdio.h> #include<time.h> void main() {time_t t;//将t声明为时间变量st ...
- C语言中静态变量的概念和用法
1.什么是静态变量 C语言中的静态变量是指被static关键字修饰的变量.静态变量有两种类型,一种是定义在全局变量上的全局静态变量,另一种是定义在局部变量上的局部静态变量.Static可以用来修饰变量 ...
最新文章
- c#_关键字base
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集
- Java引用类型有哪些
- 内嵌iframe_内嵌页面session超时,内嵌页面显示登录界面问题解决方案
- TypeScript 交叉类型(intersection type)
- 1x1 11b g n linux,基于RN1810下的2.4 GHz IEEE 802.11b/g/n无线模块
- mysql字符集解释_MySQL字符集详解
- 常见的UI设计素材模板
- Web前端工作笔记004---js--webSocket简单介绍和使用方法
- 老是说我编译版本不够_编译etcd出现的cannot load bufio的错误解决办法
- recvfrom函数 非阻塞_那些年让你迷惑的阻塞、非阻塞、异步、同步
- php 数组任意位置插入值
- iometer - 性能压力测试工具
- 无线路由器密码破解最新教程完整版
- gitlab中创建项目组及项目
- android ui 扁平化,为何UI集体变风格 扁平化是未来主流吗?
- 天猫自营和京东自营的区别
- 全球媒体网关行业收入预计2028年达到19.442亿美元
- java 使用相对路径读取文件
- 有意思的轨道交通线路图相关网站