简述c语言变量自动分配,C语言中自动变量栈的分配

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

先看一个程序。

82d947cab8bb48a292c8370d5422194e.png

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

稍微修改一下,再运行。

b45cbd1567cebe0057f21d6328ce8427.png

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

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

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

用-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_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $32, %esp movl %gs:20, %eax movl %eax, 28(%esp) xorl %eax, %eax movl $6513249, 24(%esp) movw $25185, 21(%esp) movb $0, 23(%esp) leal 24(%esp), %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf leal 21(%esp), %eax movl %eax, 4(%esp) movl $.LC1, (%esp) call printf movl $1, %eax movl 28(%esp), %edx xorl %gs:20, %edx je .L3 call __stack_chk_fail .L3: leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .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

.globlmain

.typemain, @function

main:

.LFB0:

.cfi_startproc

pushl%ebp

.cfi_def_cfa_offset 8

.cfi_offset 5, -8

movl%esp, %ebp

.cfi_def_cfa_register 5

andl$-16, %esp

subl$32, %esp

movl%gs:20, %eax

movl%eax, 28(%esp)

xorl%eax, %eax

movl$6513249, 17(%esp)

movl$1684234849, 21(%esp)

movw$26213, 25(%esp)

movb$0, 27(%esp)

leal17(%esp), %eax

movl%eax, 4(%esp)

movl$.LC0, (%esp)

callprintf

leal21(%esp), %eax

movl%eax, 4(%esp)

movl$.LC1, (%esp)

callprintf

movl$1, %eax

movl28(%esp), %edx

xorl%gs:20, %edx

je.L3

call__stack_chk_fail

.L3:

leave

.cfi_restore 5

.cfi_def_cfa 4, 4

ret

.cfi_endproc

.LFE0:

.sizemain, .-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值