首页 > 试题广场 >

阅读下面代码,变量 val 的内存地址位于?

[单选题]
void func()
{
  static int val;
  …
}
中,变量 val 的内存地址位于:
  • 已初始化数据段
  • 未初始化数据段
data段(存放已初始化的数据):存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存放在这个区域;
bss段(存放未初始化的数据):定义而没有赋初值的全局变量和静态变量,放在这个区域;
ps:
text段是程序代码段,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段的大小,编译连接时,该符号所代表的值自动代入到源程序中。
stack/heap:
栈(stack):保存函数的局部变量和参数。是一种LIFO的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。栈,另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。
堆(heap):保存函数内部动态内存分配,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是(FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。
编辑于 2018-04-10 11:01:06 回复(2)
答案:A
解释:
静态局部变量有以下特点:
该变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
编辑于 2016-11-24 17:09:32 回复(5)
这种题目怎么做的相当蛋疼呢?
发表于 2015-08-30 11:07:31 回复(0)
不是应该在bss段吗 未初始化或者初始化为0的全局变量 静态全局变量 静态局部变量不是应该在bss段吗
发表于 2015-09-16 19:11:40 回复(0)
程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
 在C程序中,在变量前加上static修饰,自动变为全局变量(静态存储期限)也就是等到程序结束后系统才收回分配的内存,如果你想继续了解这个变量定义的分排在某个位置可以使用指针变量指向这个变量,如:int *p=&val;再打印显示printf("%d\n",p); / 或者直接打印printf("%p\n",&val); 如果你想了解更多可以去上网多查阅相关资料,希望能帮助你~~~~
发表于 2018-04-03 10:52:59 回复(0)
来自@ 牛牛>牛
初始化的全局变量和静态变量存放在 data段(全局初始化区)  未初始化的全局变量和未初始化的静态变量存放在bss段(全局未初始化区),其中BSS段的特点是:在程序执行之前BSS段会自动清0,所以未初始化的全局变量和静态比那辆在程序执行之前就已经变成0, 但是并不是存放在初始化段,是因为存放在未初始化段才初始化为0的。
发表于 2017-07-07 16:52:58 回复(0)
类静态成员变量必须初始化,所以放data,而不是bbs
发表于 2016-06-08 10:40:45 回复(3)
BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的 全局变量 静态变量 的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。
——copy from 百度百科
所以结果。。。
发表于 2016-07-10 19:39:15 回复(0)
答案B
参考网上的说法
BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量的一块内存区域
发表于 2016-05-10 21:31:04 回复(0)
选B 初始化的全局变量和静态变量存放在 data段(全局初始化区)  未初始化的全局变量和未初始化的静态变量存放在bss段(全局未初始化区),其中BSS段的特点是:在程序执行之前BSS段会自动清0,所以未初始化的全局变量和静态比那辆在程序执行之前就已经变成0,但是并不是存放在初始化段,是因为存放在未初始化段才初始化为0的。 所以选B,这个够清楚吧!
编辑于 2016-09-12 09:32:48 回复(6)
变量的储存类型有四种:分别为auto(自动型)、register(寄存器型)、extern(外部型)、static(静态型)。静态型变量分配在内存的数据段中,只有在编译时才赋初值。
发表于 2018-10-15 20:26:01 回复(0)
绿色计算机
发表于 2018-06-04 14:27:18 回复(0)
数据段属于静态内存分配
发表于 2017-09-04 09:34:23 回复(0)
数据段分为data段(初始化且不为0的static和global数据)和bss段(未初始化或已初始化为0的static和global数据),这里难道不是在bss段吗?
发表于 2016-05-31 17:39:06 回复(0)
静态变量只能初始化一次,默认初始化为0,因此在已经初始化数据段:
  1 #include <stdio.h>
  2
  3 void test()
  4 {
  5     static int i;
  6     printf("i = %d\n",i);
  7 }
  8
  9 int main()
 10 {
 11     static int j;
 12     test();
 13     printf("j = %d\n",j );
 14     return 0;
 15 }

结果:
i = 0
j = 0

编辑于 2016-04-30 13:17:59 回复(0)
nm  查看在b 段   的确被初始化为0,这时因为b段被清零了。
发表于 2015-10-28 20:57:56 回复(0)