`
^=^
  • 浏览: 21853 次
  • 性别: Icon_minigender_1
  • 来自: 蘇州
文章分类
社区版块
存档分类
最新评论

關於棧地址的增長方向

 
阅读更多

一個很有意思的現象,對於上面這段代碼,Ubuntu 64bit和FreeBSD的結果是不同的。

root@ubuntu:~# ./wr
0x7fff9a648150 0x7fff9a648180
Build with gcc 4.3 under Ubuntu 64bit, 2011-7-23123456789ABCDEF

[root@freebsd ~]# ./rw
0x7fffffffec30 0x7fffffffec20
123456789ABCDEFBuild with gcc 4.3 under Ubuntu 64bit, 2011-7-23

通常意義上,函數體內部聲明的變量都會在棧上分配,地址是向下增長的,那麼就是freebsd的結果。可是Ubuntu的結果正好相反,分配地址看起來都是棧上分配的地址。

真是很奇怪的問題,難道是Ubuntu對於數組的處理採取了不同的方式?

好吧,繼續追蹤,刪掉不影響結果的代碼,最後簡化成這個樣子:

嗯,夠簡潔哦,親!

root@ubuntu:~# cc wr2.c;./a.out
0x7fff9f7e32e0 0x7fff9f7e3310 Up
[root@freebsd ~]# cc wr2.c;./a.out
0x7fffffffec50 0x7fffffffec40 Down

看見了么,親?就是這樣神奇!都是64位系統有沒有!結果就是不一樣,有沒有!

好吧,我再修改!

最終發現了這樣的現象,將str1定義為1個字節,那麼地址向下增長;定義為2個字節,地址向上增長。

又做了一些測試,得出如下結論:Ubuntu下,系統會比較兩個數組變量的空間大小,優先把小的數組定義在前面。

root@ubuntu:~# gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu4)

[root@freebsd ~]# gcc -v
Using built-in specs.
Target: amd64-undermydesk-freebsd
Configured with: FreeBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070719 [FreeBSD]

分享到:
评论

相关推荐

    查找栈的增长方向的分析及C代码实现

    本文主要是对查找栈的增长方向的分析及C代码实现,感性趣的朋友可以参考下。

    栈的属性和buf地址增长方向是两个不同的概念

    栈的属性和buf地址增长方向是两个不同的概念

    ST32堆栈增长方向及大小端测试

    专门用于ST32堆栈增长方向及大小端测试

    使用C语言判断栈的方向实例

    这一问题主要是如何判读出先后入栈的变量的地址大小,比如有a, b两个变量一先一后被定义,如果a的地址大于b的地址,则说明是以低地址方向增长的,反之,往高地址方向增长。在写C程序的时候不能简单直接的定义两个...

    阿里巴巴2015研发工程师A笔试卷及答案

    阿里巴巴2015研发工程师A笔试卷及答案

    堆和栈的区别详细说明

    堆和栈究竟有什么区别? 主要的区别由以下几点: 1、管理方式不同; 2、空间大小不同; 3、能否产生碎片不同; 4、生长方向不同; 5、分配方式不同; 6、分配效率不同;

    C语言函数调用栈(三)

    图左还示出栈的增长方向和栈的内存地址。黑色箭头和寄存器名表示当前栈帧,否则用灰色表示。图中表示tail函数内所看到的栈布局,其中完整示出tail和middle函数的栈帧结构,以及main函数的部分。注意,形参1、2、3...

    UCOSII实时操作系统(实验)

    9、栈的增长方向: 10 第二讲 调度运行机制 11 1、任务挂起和恢复 11 2、任务挂起、恢复的状态转换 13 3、时钟节拍ISR 15 4、时钟节拍函数OSTimtick() 16 5、延时系统调用 16 第三讲 任务管理uCOSII 17 1、任务删除 ...

    软件工程之专题九:数据结构知识

    顺序栈即栈的顺序存储结构是,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时设指针top指示栈顶元素的当前位置。 栈也可以用链表实现,链式存储结构的栈简称链栈。若同时需两个以上的栈,则最好...

    C语言中static 用法总结

    一、c程序存储空间布局 ... 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。  5)堆——动态存储部分。 |-----------|| ||-----------|| 栈 

    EDA/PLD中的C语言中static 用法总结

    一、c程序存储空间布局 ... 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。  5)堆——动态存储部分。 |-----------|| ||-----------|| 栈 

    Matlab分形植物模拟

    L 系统是美国生物学家Lindenmayer 1968 年为模拟生物形态而设计的描述植物形态与生长的方法。L 系 统实际上是字符串重写系统。即把字符串解释成图形,于是只要能生成字符串,也就等于生成了图形。从 一个初始串...

    windows用户称拦截api

    要注意的是,函数堆栈是反方向生长的。这时候堆栈的样子: |....| |EDI| |ESI| |EBX| |局部变量| |EBP | |返回地址| |参数1| |参数2| |参数3| |参数4| |.. | 在函数返回的时候,由函数自身来进行堆栈的清理,这...

    突破GPT-4一次只能理解50页文本限制,新研究扩展到百万token

    这样的突破并不容易,因为这些使用 Transformer 架构的模型都要面临一个问题:Transformer 处理长文档在计算上是非常昂贵的,因为注意力成本随输入长度呈二次增长,这使得大型模型越来越难以应用于更长的输入。...

    传智播客扫地僧视频讲义源码

    18_栈的属性和buf地址增长方向是两个不同的概念 19_函数调用模型_主调函数和被调用函数 20_课堂答疑_函数调用流程入栈出栈过程 21_指针也是一种数据类型_基础 22_指针也是一种数据类型_强化_传智扫地僧 源码及文档 ...

    8086寻址方式及指令系统

    11.堆栈是从 地址向 方向生长的。其操作遵循 的操作原则。 12.在进行弹栈操作时应该先将弹出的数据送 ,然后 。 13.在进行多精度加法运算时,一般使用 指令。 14.通用的数据传送指令不影响 。 15.“INC AL” ...

    TCP.IP路由技术[第二卷](CCIE职业发展系列).pdf

    Jeff Doyle,(CCIE#1919)是科罗拉多州丹佛市JuniperNetworks公司的专业服务咨询师,其主要研究方向是IP路由协议和MPLS流量工程技术。Jeff曾经设计和实现的大规模Intemet服务提供商网络遍及北美、欧洲和亚洲?并且在...

    《算法》中文版,Robert Sedgewick,塞奇威克

    1.4.4 增长数量级的分类 1.4.5 设计更快的算法 1.4.6 倍率实验 1.4.7 注意事项 1.4.8 处理对于输入的依赖 1.4.9 内存 1.4.10 展望 1.5 案例研究:union-find算法 1.5.1 动态连通性 1.5.2 实现 1.5.3 展望...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    1.4.4 增长数量级的分类 1.4.5 设计更快的算法 1.4.6 倍率实验 1.4.7 注意事项 1.4.8 处理对于输入的依赖 1.4.9 内存 1.4.10 展望 1.5 案例研究:union—find算法 1.5.1 动态连通性 1.5.2 实现 1.5.3 展望...

Global site tag (gtag.js) - Google Analytics