static数组

寻梦&之璐 2020-02-06 12:59:26
请问c++中static数组如何存储?为什么定义数组时,没有相应的汇编语言??超出数组范围的值却是0,而不是随机数。还请大佬帮帮忙
...全文
278 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2020-02-07
  • 打赏
  • 举报
回复
重复前面说过的
1 前面的测试代码,已经自己去验证 : 函数体内的static变量和全局变量一样都是处于数据段里面的
2 数据段里面的变量都是在编译器初始化后放到了磁盘保存,并在exe启动的时候加载到内存的
3 函数参数,和函数内到局部非static变量是在栈里面;
请问它是如何初始化的? 调用的时候,那么传递参数的时候如何初始化那些值呢? 你觉得你理解了明白了吗?
如果你理解了,那么全局的,static的一样啊, 只是初始化发生的时间和初始化数据的位置不同,仅此而已

static 变量在定义的时候同时初始化,仅此一次, 什么时候?
变量的存储数据在数据段里面exe加载的时候完成了,然后把变量地址匹配上

函数调用的时候,传递参数,如果是对象是不是也要初始化, 那么是什么时候?
函数内部变量定义的时候,也是初始化,初始化变量的地址在栈里面, 那是什么时候? 是不是也是调用函数的时候呢
寻梦&之璐 2020-02-07
  • 打赏
  • 举报
回复
引用 7 楼 GKatHere的回复:
对了,上面的static定义静态变量,指在全局范围内定义的全局变量。 如果是局部的,如: void f() { static A a; } 那么,在运行到f函数,执行到 static A a;这一步时,再运行 A::A(){...}对此内存空间进行赋值,而不是main前。
我想请问一下,我把一个初始化的static数组放在data区,通过这个数组去访问超出范围的变量全是0,是不是就可以证明data段中存放的全是0???
GKatHere 2020-02-07
  • 打赏
  • 举报
回复
对了,上面的static定义静态变量,指在全局范围内定义的全局变量。 如果是局部的,如: void f() { static A a; } 那么,在运行到f函数,执行到 static A a;这一步时,再运行 A::A(){...}对此内存空间进行赋值,而不是main前。
GKatHere 2020-02-07
  • 打赏
  • 举报
回复
引用 4 楼 CSNN2019 的回复:
请问大佬能再具体一些吗?我感觉有点懵,,,,static数组值如何赋进去的?
如果定义了一个数组 static int A[100]; 那么生成文件时,文件中就会包含A[100]的内容; 而运行此文件时,文件中的A[100]内容就会读入内存中,所以不需要运行时赋值。 如果静态值是类,如 class A{A(){...}}; static A a; 那么生成文件时,文件中就会包含A的内存大小这样一个空间; 而运行此文件时,文件中的A的这个空间就会读入内存,再在main函数前,运行 A::A(){...}对此内存空间进行赋值。
寻开心 2020-02-07
  • 打赏
  • 举报
回复
printf(“%c%c%c”, 0, 0,0); 你看看输出什么了
寻梦&之璐 2020-02-07
  • 打赏
  • 举报
回复
引用 15 楼 寻开心的回复:

数值0, 对应的ascii 能看吗?!!!!
啥??ASCII码看不到???
寻开心 2020-02-07
  • 打赏
  • 举报
回复

数值0, 对应的ascii 能看吗?!!!!
寻梦&之璐 2020-02-07
  • 打赏
  • 举报
回复
引用 13 楼 寻开心的回复:
超出的地方确实不都是0, 因为有可能进入其他的已经被初始化的数据占用的空间。
在全局变量在没有被初始化其他的值的情况下, 编译器会给他们默认初始化为0;
数据段是要写入exe文件保存的, 必须有明确的值,所以编译器会统一给没有指定初值的初始化为0后写入文件保存
但当我定义为static char数组时,超范围的数据为空,什么都不输出,请问这又是什么情况。。。
寻开心 2020-02-07
  • 打赏
  • 举报
回复
超出的地方确实不都是0, 因为有可能进入其他的已经被初始化的数据占用的空间。
在全局变量在没有被初始化其他的值的情况下, 编译器会给他们默认初始化为0;
数据段是要写入exe文件保存的, 必须有明确的值,所以编译器会统一给没有指定初值的初始化为0后写入文件保存
牛不才 2020-02-07
  • 打赏
  • 举报
回复
查看data段中的数据,可以直接使用一些反汇编工具来查看,可以直观的看到data是不是全是0. 在Linux可以使用objdump等 在windows上IDA Pro等 这个数组名去访问超出数组范围的变量全是0, 这个问题,只能说从数组的起始地址到超出的那个地址范围内是0. 但在这个数组之前的数据,是不是为0,就不确定,而且也是有可能存在data段的。
寻梦&之璐 2020-02-07
  • 打赏
  • 举报
回复
引用 10 楼 牛不才的回复:
[quote=引用 8 楼 CSNN2019 的回复:] [quote=引用 7 楼 GKatHere的回复:]对了,上面的static定义静态变量,指在全局范围内定义的全局变量。 如果是局部的,如: void f() { static A a; } 那么,在运行到f函数,执行到 static A a;这一步时,再运行 A::A(){...}对此内存空间进行赋值,而不是main前。
我想请问一下,我把一个初始化的static数组放在data区,通过这个数组去访问超出范围的变量全是0,是不是就可以证明data段中存放的全是0???[/quote] 未初始化的静态变量是0,但如果是已经初始化的静态变量,可不一定是0呀,比如 static int g_init = 3; 这个变量放在data段,可它不是0[/quote] 初始化的static数组放在data区,通过这个数组名去访问超出数组范围的变量全是0,是不是就可以证明data段中存放的全是0
牛不才 2020-02-07
  • 打赏
  • 举报
回复
引用 8 楼 CSNN2019 的回复:
[quote=引用 7 楼 GKatHere的回复:]对了,上面的static定义静态变量,指在全局范围内定义的全局变量。 如果是局部的,如: void f() { static A a; } 那么,在运行到f函数,执行到 static A a;这一步时,再运行 A::A(){...}对此内存空间进行赋值,而不是main前。
我想请问一下,我把一个初始化的static数组放在data区,通过这个数组去访问超出范围的变量全是0,是不是就可以证明data段中存放的全是0???[/quote] 未初始化的静态变量是0,但如果是已经初始化的静态变量,可不一定是0呀,比如 static int g_init = 3; 这个变量放在data段,可它不是0
寻开心 2020-02-06
  • 打赏
  • 举报
回复
编译器
程序包含数据段
生成exe文件的时候就给初始化进去了
寻梦&之璐 2020-02-06
  • 打赏
  • 举报
回复
引用 3 楼 GKatHere的回复:
[quote=引用 2 楼 CSNN2019 的回复:] 那static数组中的赋值怎么赋进去的?我很奇怪,初始化这个static数组时它的汇编代码居然没有???输出的时候数值从哪来??最起码一般数组我看到通过通用寄存器来把数值赋进去,可他一句没有
你这涉及到系统文件加载过程。 以PE文件的为例:分为代码段,数据段等, static数组放在数据段,它的值在生成文件时已经初始化为0,加载文件时,读入即可 另外如果你用类 class A{A(){...}}, static A a; 那么它在加载初始化时,会调用A的初始化函数[/quote] 请问大佬能再具体一些吗?我感觉有点懵,,,,static数组值如何赋进去的?
GKatHere 2020-02-06
  • 打赏
  • 举报
回复
引用 2 楼 CSNN2019 的回复:
那static数组中的赋值怎么赋进去的?我很奇怪,初始化这个static数组时它的汇编代码居然没有???输出的时候数值从哪来??最起码一般数组我看到通过通用寄存器来把数值赋进去,可他一句没有
你这涉及到系统文件加载过程。 以PE文件的为例:分为代码段,数据段等, static数组放在数据段,它的值在生成文件时已经初始化为0,加载文件时,读入即可 另外如果你用类 class A{A(){...}}, static A a; 那么它在加载初始化时,会调用A的初始化函数
寻梦&之璐 2020-02-06
  • 打赏
  • 举报
回复
那static数组中的赋值怎么赋进去的?我很奇怪,初始化这个static数组时它的汇编代码居然没有???输出的时候数值从哪来??最起码一般数组我看到通过通用寄存器来把数值赋进去,可他一句没有
寻开心 2020-02-06
  • 打赏
  • 举报
回复
静态变量并没有分配在堆栈里面,实际上它和全局变量一样是分配在数据段里面的
数据段的数据,默认初始化都是0了
所以越界也是0

#include <stdio.h>
int g;
int main() {
int local;
static int s;
printf("%p %p %p", &local, &s, &g);
return 0;
}

输出这个三个变量的地址, 你能看到static int s的指针和全局变量g的指针是相邻的

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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