在以下代码中:
int main()
{
int i;
char* s = "Hello";
i = 10;
}
在记忆中:
10
应该进入堆栈
"hello"
的地址应该进入堆栈
"Hello"
应存储在只读内存
在流程记忆中,i
和s
在哪里。他们住在哪里?
答案 0 :(得分:1)
变量名只是程序员的便利,所以他可以参考它们。它们的值存储在编译器认为适合放置它们的任何地方,但名称将被丢弃。
如果优化器确定某个变量的范围足够小并且有足够的寄存器可用,那么您引用为i
的变量甚至可能在进程内存中没有存储位置,因为它可以保存在注册。
所以它主要取决于编译器决定,某个变量在哪里。静态和全局变量总是在进程内存中,但局部变量可能不在堆栈中。
答案 1 :(得分:0)
对于这个程序:
i
和s
位于堆栈中。"Hello"
存储在程序.rodata
部分。10
的值 $10
(i
)和"Hello"
字符串的地址({在.LC0
功能序言中,s
的{{1}}被初始化为i
和s
。你可以看到这一切都发生在例如main
将输出gcc -S -o bar.s bar.c
的汇编语言代码:
bar.c
答案 2 :(得分:0)
这里的i和s是局部变量,因此它们存储在堆栈段中。通过引用i和s,这里只是语言中的表示。