指针为何不能在全局作用域内申请内存??(兼某段C++标准的理_第1页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、指针,为何不能在全局作用域内申请内存?(兼某段c+标准的理好吧。首先得承认这应当是个较低级的错误,c/c+老手估量不会犯这种错。但我犯了。 上个星期帮学生做个容易的控制台c程序,编译器为gcc,我在全局作用域中定义了指针变量并为其申请空间,满心以为这没什么问题,谁知编译的时候弹出了下面的错误: initializer element is not constant 错误指向我定义全局指针并申请了内存空间的语句。时光较紧,我没有细想,上网搜了一下,结果是c99标准中全局变量和ic静态变量的初始化必需用法常量表达式,而且指针不能在全局作用域内申请内存,当初我很怀疑,但也只是照着改了过来,将申请内存

2、放到函数中执行就o了,后头就没有再思量其背后的原因了。 今日上午在教室看书(程序员的自我修养一书),看到二进制文件,程序装载的时候,我骤然意识到上个星期这个问题估量同它们有关系,下完课后兴冲冲跑回寝室以求探究真理。 于是我写了个测试程序: 1 ilude stdio.h 2 include stdlib.h 3 4 typef suct _image 5 6 int ; 7 struct _image *nt; 8 *pimage, image; 9 10 pimage image = (pimage)malloc(sizeof(image);11 int *i = (int *)malloc

3、(sizeof(int);12 13 /image image;14 /int i;15 16 int main(void)17 18 return 0;19 编译不出意外浮现了 intializer element is not constant 的错误,将10,11行注释掉,将13,14行去注释,编译不再有错。 直觉是同编译后生成的二进制文件存储格式有关系。于是翻书,初步验证我的主意: (我在linux下编译的,二进制文件格式为elf,windows虽然是pe也可参考,究竟都是coff标准嘛!) 编译器将源码编译为目标文件or二进制文件时,会将数据存放于存放于各个段中。根据elf/coff

4、的标准,初始化了的全局变量和局部static变量存放于.data段,.bss段记录未初始化的全局变量和局部static变量。(注重,.bss不会存放数据,只用于为变量预留空间)。这就说明了为何c99标准要求全局变量和staitc变量初始化必需用法常量表达式。用常量表达式初始化,程序在编译的时候才干够将该两种类型变量的数据顺当写入.data段中。举个例子,如果我这么为全局变量赋值: int a = 1;int b = a;/(注重:在全局作用域中) 此时编译绝对还是会报出之前同样的错误。全局变量a的赋值是没有错的,此时数据1顺当写入.data段中同a 绑定 ,但是全局变量b的赋值却不尽人意了。为

5、何?首先,b用法a变量举行初始化,但是b真能取到a的值吗?你大概会问,a不是已经赋值为1了吗?为神马不行以这么做? 对于这个问题,首先我们得明确编译的概念。编译是将程序代码转换为目标代码的过程。它是一个翻译的过程,不能执行程序。int b = a,这一句需要我们到内存中执行程序才干够实现,程序需要先取到a的值,再把该值复制到b对应的内存空间。但是现在我们是在编译耶!编译程序只将a的值写入.data并记录a符号之后就没有变量a什么事情了,b绝对是取不到a的值的! 好了,我们理解了那条标准制定的背后的缘由,现在有关指针在全局作用域中申请内存空间错误的理解也就水到渠成了。 由 初始化了的全局变量和局

6、部static变量存放于.data段,.bss段记录未初始化的全局变量和局部static变量 这句话可知,在我之前的程序中,我申请内存来初始化我的两个指针变量image和i,image和i应位于.data段上。定义指针没错,问题是,我现在能够申请到内存吗?不要以为这段代码是在程序装入到内存后执行的。事实上,由于编译器判定你是全局变量,此时它就是要你拿出常量来初始化它的变量好让它能往.data段中写数据,所以以编译器的规律你需要实实在在的从内存中申请到内存并把他们的值写入到.data段中。但实际可行吗?不行行。且不说编译器不会帮你申请,程序需要在链接装载到内存后才会在虚拟内存中映射自己的堆栈段。于是,这段代码夭折了,它天经地义的报错了。 over,写blog总是不易的,何况我不能保证我的主意

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论