我试图理解变量存储在内存堆栈中的方式以及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);
}
答案 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; 每次将值推入或弹出堆栈时,堆栈指针都会注册堆栈的顶部 - 堆栈指针被调整为指向空闲内存。然后是堆栈帧,它对应于对函数的调用,该函数尚未以返回结束。
另一部分是&#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)