C 本地初始值存储在? #包括 int main() { int i=10; 返回0; }
在上述程序中,值10究竟存储在哪里 我理解我存储在堆栈中的变量。堆栈在运行时填充。来自“where-justice”10。10是一个“文本”,将由编译器在编译期间生成。然后它将被分配给堆栈上的变量。像C 本地初始值存储在? #包括 int main() { int i=10; 返回0; },c,segments,C,Segments,在上述程序中,值10究竟存储在哪里 我理解我存储在堆栈中的变量。堆栈在运行时填充。来自“where-justice”10。10是一个“文本”,将由编译器在编译期间生成。然后它将被分配给堆栈上的变量。像 #include <stdio.h> int main() { int i = 10; return 0; } 虽然这是伪代码,但它将为变量i(地址为0x12345678)分配值10,该值以前存储在eax10是一个常量,因此编译器将直接在程序的可执行部分使用数字10作为C
#include <stdio.h>
int main()
{
int i = 10;
return 0;
}
虽然这是伪代码,但它将为变量
i
(地址为0x12345678)分配值10
,该值以前存储在eax
10是一个常量,因此编译器将直接在程序的可执行部分使用数字10作为CPU指令的一部分
下面是在我的系统上使用gcc
生成的程序集:
mov eax, 10;
mov [0x12345678], eax;
(之所以出现4
,是因为int
的长度为4字节)
请注意,所有这些都是实现的一部分,但上述情况在实践中发生。语言本身没有指定这些细节。将有一条明确的机器代码指令,用于设置
i
比如:
movl $10, -4(%rbp)
编译和链接后,可执行文件包含多个。其中两种类型的区段是:
- 文本段-包含实际代码
- 数据段-包含静态数据
这是一个非常基本和粗略的描述,系统和编译器之间有很多细节不同。值10存储在包含源代码的物理源文件中。在执行过程中,该值被传输到名为
i
的变量,该变量具有自动存储持续时间,类型为int
。这才是最重要的。在通用编程语言(如C)领域,任何进一步的问题都是无效的
注意大多数答案都提到编译器吗?如果…怎么办?这些答案仍然有效吗?如果你愿意,我宁愿不“给人一条鱼”。。。您可以亲自查看:
获取代码并从中创建一个对象文件:
MOV AL, 10
然后对生成的文件执行对象转储:
> gcc -c file.c -o file.o
objdump-d file.o
第节的分解。正文:
0000000000000000 :
0:55推送%rbp
1:48 89 e5 mov%rsp,%rbp
4:48 83欧共体10分$0x10,%rsp
8:c7 45 fc 0f 00 movl$0xa,-0x4(%rbp)//在这里您可以看到
//原始值0xa(10)
//正在设置,所以它在
//.文本部分
但是10应该是任何一个的一部分吗?是否存在不属于以下部分的程序的任何其他部分??:1.文本第2段。初始化数据段3。未初始化的数据段4。堆栈5。Heap@kumar-文本。这意味着可执行指令,而不是数据。谢谢teppic。我得到的答案就像我在聊天一样。速度很快。@kumar-如果你使用gcc,试着像这样编译
gcc-S foo.c
来查看.S文件,你会看到所有的部分,以及如何直接在CPU代码中放入简单的整数。@modifiablelvalue-问题是关于段和堆栈的,很明显,这是关于编译代码的。我建议你仔细搜索一下你非常喜欢的术语“堆栈”。一旦你这样做了,考虑寻找“自动存储持续时间”,看看这是什么意思…@修正值OK,所以,你的意思是说,你不知道答案。我的意思是“答案非常模糊,因为问题非常广泛”和“你的逻辑非常狭窄;C语言中没有堆栈”。在我进入“callstack呢?”的辩论之前,这里有谁知道CPS?编译过程中编译器会生成一个文本。好的,这也是代码的一部分,是在“文本段”中吗??我的理解是,代码的任何部分都应该出现在五段代码中的任何一段中。文本第2段。初始化数据段3。未初始化的数据段4。堆栈5。堆如果我错了,请更正。是的,它将被放入.text
-段
> objdump -d file.o
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: c7 45 fc 0f 00 00 00 movl $0xa,-0x4(%rbp) // Right here you can see
// the raw value 0xa (10)
// being set, so it's in the
// .text section