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将在只读初始化部分中分配内存.那么为什么数据部分的大小保持相同?
#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
实际上,这是一个实现细节。编译器按照“原样”原则工作。这意味着只要程序的行为相同,就可以自由地排除它想要的任何代码片段。在这种情况下,它可以char* p = "hello"完全跳过。