a.out中的数据部分

use*_*088 5 c unix operating-system systems-programming

这是我执行的一个简单代码

int a;
int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后用gcc编译后我做了

size a.out
Run Code Online (Sandbox Code Playgroud)

我在bss和数据部分得到了一些输出...然后我将我的代码更改为此

int a;
int main()
{
    char *p = "hello";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

再次当我在编译后通过大小a.out看到输出时,数据部分的大小保持不变.但是我们知道字符串hello将在只读初始化部分中分配内存.那么为什么数据部分的大小保持相同?

Jee*_*tel 5

#include <stdio.h>

int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给

   text    data     bss     dec     hex filename
    960     248       8    1216     4c0 a.out
Run Code Online (Sandbox Code Playgroud)

当你这样做

int a;
int main()
{
    char *p = "hello";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给

   text    data     bss     dec     hex filename
    982     248       8    1238     4d6 a.out
Run Code Online (Sandbox Code Playgroud)

那时hello被存储在,.rodata并且该地址的位置存储在char指针中,p但这里p存储在堆栈中

和大小不显示堆栈.我不确定但.rodata在这里以文本或十进制计算.


当你写作

int a;
char *p = "hello";
int main()
{
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

它给

   text    data     bss     dec     hex filename
    966     252       8    1226     4ca a.out
Run Code Online (Sandbox Code Playgroud)

现在这里再次将"hello"存储在.rodata中,但char指针占用4个字节并存储在数据中,因此数据增加4

有关详细信息,请访问http://codingfreak.blogspot.in/2012/03/memory-layout-of-c-program-part-2.html


Luc*_*ore 2

实际上,这是一个实现细节。编译器按照“原样”原则工作。这意味着只要程序的行为相同,就可以自由地排除它想要的任何代码片段。在这种情况下,它可以char* p = "hello"完全跳过。