一道笔试题,不太清楚,请各位大侠指点~~

追小虫的蚂蚁 2010-12-22 12:38:00
前段时间做了一家公司的笔试题~~有一道题不太清楚,请指点。题目:

int a;
static int b;
const int c;
int d=0;
int main(int argc, char **argv)
{
int c;
static int f;
const int g;
int h=0;
char *p=malloc(1);
}
问:a, b, c, d, e, f, g, h, p分别位于()
A.text段 B.data段 C.rodata段 D.bss段 F.debug段 G.info段 G.stack段 H.heap段

小弟第一次发帖,请各位大侠多多指点,十分感谢!
...全文
287 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nina_Nina_Nina 2011-07-26
  • 打赏
  • 举报
回复
int a;//全局变量但未初始化 .bss
static int b;//静态变量未初始化 .bss
const int c;//只读常量 .rodata
int d=0;//全局变量且初始化 .data
int main(int argc, char **argv)
{
int c;//函数成员变量 栈区
static int f;//局部静态变量 为初始化 .bss
const int g;//若编译能通过 只读常量 .rodata(对这个变量我持有疑问)
int h=0;//类此与变量c 栈区
char *p=malloc(1);//动态分配 堆区
}
问:a, b, c, d, e, f, g, h, p分别位于()
A.text段 B.data段 C.rodata段 D.bss段 F.debug段 G.info段 G.stack段 H.heap段
vgxpm 2010-12-23
  • 打赏
  • 举报
回复
学习啦!不管懂不懂,至少见识啦!呵呵
niuchengshi 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 cilluick 的回复:]

引用 11 楼 utank_yu 的回复:

引用 1 楼 xy_zhang 的回复:
const int g; //这个编译能通过?


可以通过啊~~~


const是定义常量必须初始化,如果能编译通过,应该是编译器做了优化了。
[/Quote]

弱弱的问一句,好像c++把const定义的是常量,而c里仍然是变量吧,只是个只读的变量。如
const int i=10;
int a[i];这个就通不过编译。要是常量的话,应该可以。
prohibit 2010-12-22
  • 打赏
  • 举报
回复
int a;//静态存储区的未初始化读写数据区
static int b;//静态存储区的未初始化读写数据区
const int c;//静态存储区的只读数据区
int d=0;//静态存储区的已初始化读写数据区
int main(int argc, char **argv)
{
int e;//栈内存区
static int f;//静态存储区的未初始化读写数据区
const int g;//栈内存区
int h=0;//栈内存区
char *p=malloc(1);//堆内存区
}
cilluick 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 utank_yu 的回复:]

引用 1 楼 xy_zhang 的回复:
const int g; //这个编译能通过?


可以通过啊~~~
[/Quote]

const是定义常量必须初始化,如果能编译通过,应该是编译器做了优化了。
hw_henry2008 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jzy4077 的回复:]
回复20楼:

目标文件与可执行文件是有区别的!!
[/Quote]
嗯,说的对,谢谢了,呵呵
aimerjing 2010-12-22
  • 打赏
  • 举报
回复
又接触了不到以前没见过的东西啊。
JZY4077 2010-12-22
  • 打赏
  • 举报
回复
回复20楼:

目标文件与可执行文件是有区别的!!
JZY4077 2010-12-22
  • 打赏
  • 举报
回复
本人只是菜鸟呀!嘎嘎
hw_henry2008 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jzy4077 的回复:]
c语言的编译器在编译的时候会生成一个可重定位目标文件ELF ,在这个ELF文件中具有几个节,
在楼主的这个程序中,
int a;
static int b;
const int c;
int d=0;
int main(int argc, char **argv)
{
int c;
static int f;
const int g;
int h=0;
……
[/Quote]
#16楼的哥们说对了,我在赵炯的《linux 0.12》内核源码剖析里面见到过这方面的东西,
是linux 0.12的目标文件的格式。就是可执行文件的格式。
在第三章里面有介绍,建议去看看,另外就是变量的分配策略,编译原理里面有讲的。呵呵···
一起学习·····
追小虫的蚂蚁 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 utank_yu 的回复:]
引用 10 楼 hw_henry2008 的回复:
再细点就不知道了,抱歉哦,得学习一下了
int a;
static int b;
const int c;
int d=0;//上面的都在全局作用区
int main(int argc, char **argv)
{
int c;//栈中
static int f;//在全局数据区
const int g;//能编译通过,在栈……
[/Quote]

8楼那位兄台说const int c;在rodata段,,不知道确切的是哪个呢??
bluesky12312388 2010-12-22
  • 打赏
  • 举报
回复
p在区,*p在
xiakewudixl 2010-12-22
  • 打赏
  • 举报
回复
这个貌似是我们内部的考试题
JZY4077 2010-12-22
  • 打赏
  • 举报
回复
c语言的编译器在编译的时候会生成一个可重定位目标文件ELF ,在这个ELF文件中具有几个节,
在楼主的这个程序中,
int a;
static int b;
const int c;
int d=0;
int main(int argc, char **argv)
{
int c;
static int f;
const int g;
int h=0;
char *p=malloc(1);
}
全局变量包括初始化与未初始化的,初始化的变量会存储在.data段中,而未初始化的全局变量会存储在.bss段中,因此全局变量a存储在.data段中,而d会存储在.bss段中。

而对于带有关键字const的变量会存储在.rodata段,存储在这个段中的变量的属性是只读的,因此c和g会存储在这个段中。

对于带有关键字static 的变量,在.data段和.bss段中会为其分配内存,其中已经初始化的static属性的变量会存储在.data段中,而未初始化的static属性的变量会存储在.bss段中。因此b和f存储在.data段中。

而对于在函数内部定义的变量会存储在“堆栈”(stack)区和“堆”(heap)区中!这个应该是很好区别的!!



楼主上面给出的.text段 , .debug段和info段,其中我对info没有见过,不是很了解。
.text段是代码段,存放的是程序执行的代码。
.debug段是一个调式的符号表,存放的是调式时的一些信息,包括一些局部变量和一些全局变量!!


以上只是我的个人理解,不知道对不对!望朋友们指正!!!
mzxniasf 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 utank_yu 的回复:]

引用 10 楼 hw_henry2008 的回复:
再细点就不知道了,抱歉哦,得学习一下了
int a;
static int b;
const int c;
int d=0;//上面的都在全局作用区
int main(int argc, char **argv)
{
int c;//栈中
static int f;//在全局数据区
const int g;//能编译通过,在……
[/Quote]



全局变量b前面的static改变的是链接属性,即限制其链接范围为只在本文件中有效,因为全局变量本身就是static了。

后面那个局部变量f的static才是改变的的存储属性,即放入静态数据区存储。

加不加const对变量的存储位置没有影响。
追小虫的蚂蚁 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hw_henry2008 的回复:]
再细点就不知道了,抱歉哦,得学习一下了
int a;
static int b;
const int c;
int d=0;//上面的都在全局作用区
int main(int argc, char **argv)
{
int c;//栈中
static int f;//在全局数据区
const int g;//能编译通过,在栈中
int h=0;//一样,栈中
……
[/Quote]
谢谢啦~~~
就不是很清楚static int b;和const int c;这两个!还有info段 rodata段 debug段没见过~~
金刚葫芦娃 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 utank_yu 的回复:]
引用 4 楼 xy_zhang 的回复:
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code ……
[/Quote]


全局变量和静态变量的存储是放在一块的,都放在全局区(静态区),初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间。

xy_zhang 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 utank_yu 的回复:]

想具体问问:
static全局变量;static局部变量所处的位置是否相同??
const int c;跟 const int g;是否也相同??
[/Quote]

static全局变量;static局部变量应该一样,如果初始化就放在data,没有初始化就放在bss
全局const int c放在rodata。
局部const int g不懂,参考http://topic.csdn.net/u/20101213/10/02955f8b-8b45-4729-b187-884fff47d072.html。
追小虫的蚂蚁 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xy_zhang 的回复:]
const int g; //这个编译能通过?
[/Quote]

可以通过啊~~~
hw_henry2008 2010-12-22
  • 打赏
  • 举报
回复
再细点就不知道了,抱歉哦,得学习一下了
int a;
static int b;
const int c;
int d=0;//上面的都在全局作用区
int main(int argc, char **argv)
{
int c;//栈中
static int f;//在全局数据区
const int g;//能编译通过,在栈中
int h=0;//一样,栈中
char *p=malloc(1);//动态分配在堆上
}
加载更多回复(9)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧