`
^=^
  • 浏览: 23775 次
  • 性别: 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语言编写的程序,用于查找栈的增长方向: ```c #include typedef unsigned char UINT...

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

    需要注意的是,buf地址增长方向与栈的生长方向是两个独立的概念。栈的生长方向影响的是栈帧(Stack Frame)的分配和回收,而buf地址增长方向是数组访问逻辑的一部分。例如,即使栈向下生长,buf指向的数组中的元素...

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

    在STM32中,堆栈通常位于RAM的高地址向低地址方向增长,这是大多数嵌入式系统中的常见设置。当程序调用函数、保存寄存器或分配局部变量时,新的数据会被压入堆栈的顶部,即较高地址。当这些数据不再需要时,它们会从...

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

    在函数调用时,新创建的局部变量通常会被放入栈中,随着函数的执行,栈会根据其生长方向动态调整。 在给出的代码中,我们定义了一个全局静态变量`stack_direction`用于存储栈的方向判断结果,初始化为0。然后定义了...

    堆和栈的区别详细说明

    - **栈**:栈的生长方向是从高地址向低地址增长,即栈顶指针随着入栈操作不断减小,随着出栈操作不断增大。 - **堆**:堆的生长方向没有固定规律,主要根据实际内存分配情况动态变化。 #### 5. 分配方式不同 - *...

    栈溢出 (1).pdf

    在栈上,数据的存储方向是从高地址向低地址增长。当函数被调用时,它的状态,包括参数和局部变量,会被压入栈顶;当函数返回时,栈顶的状态被弹出,这样调用栈就回到了初始状态。 在栈溢出的上下文中,有两个非常...

    C语言 栈的基本操作

    出栈操作首先判断栈是否为空,若非空,则取出栈顶元素,并将栈顶指针向栈底方向移动一位。 #### 获取栈顶元素 ```c Status GetTop(SqStack S, SElemType &e) { if (S.top == S.base) return ERROR; // 栈为空时不...

    STM32的堆和栈.pdf

    栈的分配方向是向下的,即从内存的高地址向低地址方向增长。由于栈的这种特性,开发者需要注意不要在栈上分配大量的局部变量,特别是在存在大型数组或进行大量递归调用的情况下,因为这样很容易导致栈溢出,从而使...

    栈回溯技术及uClibc的堆实现原理.doc

    栈的增长方向是向下增长的,栈的大小是有限的,超过栈的大小会导致栈溢出错误。 uClibc 是一个小型的 C 库,提供了基本的库函数,uClibc 的堆实现原理是使用链表来管理内存,包括动态内存分配和释放。uClibc 的堆...

    C++中堆和栈的区别

    4. 生长方向不同:堆的生长方向是向上的,而栈的生长方向是向下的。 5. 分配方式不同:堆都是动态分配的,而栈是静态分配的。 6. 分配效率不同:堆的分配效率比栈慢。 因此,理解堆和栈的区别是非常必要的,以便...

    技术问题---堆和栈的区别

    此外,堆和栈的生长方向也不同。栈是从高地址向低地址生长,而堆是从低地址向高地址生长。这意味着栈的大小在编译时就已经确定,而堆的大小则随着程序运行时的内存需求动态变化。 在效率方面,栈的存取速度通常比堆...

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

    这段代码实现了遍历二叉树的过程,通过栈来辅助完成中序遍历,同时更新最大值和最小值。 ### 5. Android APP与Web服务优化策略 问题描述: 一家公司开发了一个 Android APP,该 APP 需要访问 Web 服务器提供的服务...

    C++堆、栈及静态数据区详解

    4. 生长方向:栈向下生长,堆向上生长。 5. 分配方式:栈有静态和动态分配,堆只有动态分配。 6. 分配效率:栈的分配和释放效率高,堆的分配和释放相对较慢。 理解这些内存区域对于编写高效、无错误的C++代码至关...

    栈_数据结构

    **影响栈算法的关键因素** 包括数组的隐含属性(起始下标和元素个数)、栈的生长方向、栈顶和栈底的定义以及如何判断栈是否为空或满。 **顺序存储栈的C++语言实现** 如下所示: ```cpp template void init_Stack(T...

    【案例分析】如何分析linux下被破坏的栈

    栈空间在进程内存布局中通常位于堆的上方,其增长方向是从高地址向低地址增长。栈空间主要分为以下几个部分: - **帧头**(Frame Header):包含当前函数调用的上下文信息,如旧的`ebp`寄存器值、函数参数等。 - **...

    栈和堆的区别 doc

    - 栈通常从高地址向低地址增长,即随着新分配的内存向栈底移动。 - 堆则相反,它从低地址向高地址增长,即随着新的内存分配向堆的顶端移动。 5. **分配方式**: - 堆内存的分配和释放由程序员直接调用`malloc()`...

    函数栈分析[收集].pdf

    栈按照地址降低的方向增长,%esp指向栈顶元素。可以使用pushl和popl指令在栈上存储和检索数据。对于未初始化的数据,只需简单地将栈指针减去所需的空间大小即可在栈上分配空间。 函数调用的这种机制使得程序能够...

    C语言中的5个段作用[定义].pdf

    栈空间的增长方向在不同的处理器类型中不同,有些处理器规定栈的增长方向从低地址向高地址增长,而有些处理器则规定栈的增长方向从高地址向低地址增长。UC/OSII使用宏OS_STK_GROWTH来标识栈的增长方向。

Global site tag (gtag.js) - Google Analytics