C 本地初始值存储在? #包括 int main() { int i=10; 返回0; }

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

在上述程序中,值10究竟存储在哪里

我理解我存储在堆栈中的变量。堆栈在运行时填充。来自“where-justice”10。10是一个“文本”,将由编译器在编译期间生成。然后它将被分配给堆栈上的变量。像

#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要么存储在文本段中(作为将10设置为特定地址或寄存器的指令),要么作为数据段中的数据存储(由代码检索并存储在特定地址/寄存器)

编译器决定什么是最好的(对于给定的编译标志最有效)。但我认为它“存储”在文本段中,因为值10“在代码中创建”非常简单(如其他一些答案所示)

更复杂的数据(结构、字符串等)通常存储在数据段中。

堆栈是操作系统为程序留出的内存区域,与堆、全局变量和可执行代码分开

调用函数时,有代码将参数推送到堆栈上,然后为局部变量留出空间。当函数返回此空间并且所有参数都从堆栈中“弹出”时,下一个函数可以重用内存


这是一个非常基本和粗略的描述,系统和编译器之间有很多细节不同。

值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