想要了解函数变量如何存储在堆栈

时间:2015-08-12 18:48:16

标签: c

我试图理解变量存储在内存堆栈中的方式以及printf语句的打印内容。您对此的见解将受到高度赞赏。谢谢。

Ideone链接http://ideone.com/uWvPpX

#include <stdio.h>

int main(void) {

    foo("%x");
    return 0;
}

void foo(char *str)
{

    char c='c';
    printf(str);

    printf("\n%x",&c);
}

2 个答案:

答案 0 :(得分:1)

%x是一种格式说明符,表示您希望以小写十六进制格式打印。 因此,当您未在第一个printf中指定数据时,结果是未定义的。即使代码编译 - 它也不完整!

所以让我们先修复代码 - 这里是修改后的代码

#include <stdio.h>

void foo(char *str);

int main(int argc, char* argv[])
{

    foo("%x");
    return 0;
}

void foo(char *str)
{

    char c='c';
    printf(str,c);

    printf("\n%x",&c);
}

现在回答你的问题&#34;变量如何存储在内存堆栈中&#34; 每次将值推入或弹出堆栈时,堆栈指针都会注册堆栈的顶部 - 堆栈指针被调整为指向空闲内存。然后是堆栈帧,它对应于对函数的调用,该函数尚未以返回结束。 enter image description here

另一部分是&#34; printf语句正在打印什么。&#34; printf中的第一个参数是格式说明符,第二个参数是用于那些格式说明符的数据。当您在第一个原始printf中没有c时 - 它只是拾取了相邻的int并打印了指定的%x。在修改后的第一个printf中,我用十六进制打印了c的cvalue。在第二个printf中,您可以打印堆栈中C变量的地址。

查看这些链接以获取更多详细信息 - https://en.wikipedia.org/wiki/Call_stack#Structure 还有其他Stackoverflow Q&amp; As显示在右侧窗格中。

答案 1 :(得分:0)

TO 8086平台:正如您可以阅读here,堆栈是运行时/调用堆栈,每个函数本地变量都存储在当前过程堆栈帧中。阅读有关运行时/调用堆栈here

的更多信息