【问题标题】:Finding the address of a char array in the stack在堆栈中查找 char 数组的地址
【发布时间】:2014-12-21 23:33:53
【问题描述】:

我正在尝试了解堆栈的布局以及内存的分配方式。

我有以下程序,如果假设堆栈从地址 12000 开始(例如),我想知道 buffer 数组的起始地址。

void function( int a, int b ) {     
    char buffer[ 512 ]; 
} 

void main() {
    function( 1, 2 );
}

【问题讨论】:

  • 您必须编译代码并检查二进制文件(或打印出function 中的地址)。标准 C 中没有任何内容可以让您计算该地址,它完全取决于编译器/平台。
  • @1336087 栈通常是向下增长的,你没有考虑main的函数调用(这取决于地址有多大)。
  • "我想知道缓冲区数组的起始地址" 你不能,因为你不知道你的特定编译器的特定版本决定在你的特定程序上做什么一周中特定日期的优化级别。也许它根本没有为buffer 分配任何空间,因为它没有被使用。或者它可能因为它是星期天而在堆上分配它,并且因为它可以。
  • 我使用的是 Fedora 32 位。 gdb 会帮助我了解完整的堆栈吗?
  • @ooga:它是特定于架构的。

标签: c memory-management stack


【解决方案1】:

函数中非静态局部变量的地址取决于调用函数时执行点的堆栈状态(SP 寄存器的值)。

简单来说,buffer 每次调用function 时可能有不同的地址。

强调这一点后,您可以使用以下任一选项:

printf("%p", buffer); // applicable only for arrays
printf("%p",&buffer); // applicable for arrays and for non-arrays

【讨论】:

  • 那么在栈的布局中,缓冲区地址究竟从哪里开始呢?是刚开始还是介于两者之间,还是因架构和编译器而异?
  • @user3257977:就像我在回答中说的那样,每次调用函数时缓冲区的地址可能都不一样。
【解决方案2】:

您可以显示运行时使用的地址

#include <stdio.h>

void function( int a, int b ) {
    int c;
    char buffer[ 512 ]; 
    int d;
    printf ("Address of a is %p\n", &a);
    printf ("Address of b is %p\n", &b);
    printf ("Address of c is %p\n", &c);
    printf ("Address of d is %p\n", &d);
    printf ("Address of buffer is %p\n", buffer);
} 

void main() {
    function( 1, 2 );
}

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2016-02-21
    • 2023-03-20
    • 1970-01-01
    • 2018-06-25
    • 2011-04-01
    • 2021-05-10
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多