繁体   English   中英

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

[英]Want to understand how function variables are stored in stack

我试图了解如何将变量存储在内存堆栈中以及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);
}

%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);
}

现在回答您的问题“如何将变量存储在内存堆栈中”每次将值压入或弹出堆栈时,堆栈指针都会注册堆栈的顶部-调整堆栈指针使其指向空闲状态记忆。 然后是堆栈帧,它对应于尚未以返回终止的函数调用。 在此处输入图片说明

另一部分是“ printf语句正在打印什么”。 printf中的第一个参数是格式说明符,第二个参数开始是要用于那些格式说明符的数据。 当您的第一个原始printf中没有c时-它只是拿起相邻的int并将其打印为指定的%x。 在修订的第一份printf中,我以十六进制打印出c的c值。 在第二个printf中,使它打印堆栈中C变量的地址。

检查这些链接了解更多详情- https://en.wikipedia.org/wiki/Call_stack#Structure另外其他#1 Q&至于在右侧窗格中显示出来。

TO 8086平台:如您在这里所读,stack是运行时/调用栈,每个函数的本地var存储在当前过程栈框架中。 在此处阅读有关运行时/调用堆栈的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM