| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3229 人关注过本帖
标题:深入指针笔记二
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用embed_xuel在2012-7-28 12:45:02的发言:

常量区
……和静态存储区有区别吗?

梅尚程荀
马谭杨奚







                                                       
2012-07-28 12:52
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 21楼 有容就大
关键词大家直接用e文表示吧,

看的我头大

The quieter you become, the more you can hear
2012-07-28 12:57
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
你先说一下什么是静态存储区?什么东东是放在静态存储区的?可以写个程序验证一下

总有那身价贱的人给作业贴回复完整的代码
2012-07-28 12:59
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以前我认为静态存储区和常量区是一起的,看了楼上各位的说法才知道原来是分开的,不过看了下面这个有点迷糊
程序代码:
不要区分静态存储和常量存储,还有个未初始化数据段BSS,这些都属于静态概念,也就是独立于栈存储和动态存储。普通的全局变量本身放在静态段,常量全局变量和字符串字面值放在常量存储,如果全局变量没有初始化,则放在BSS段,这个段很特殊,假如是初始化的全局变量(常量或者非常量)或者字面值,会可执行文件上占大小,但是BSS段的数据在可执行文件里只有一个段的起始地址和长度。在可执行文件加载进内存时,加载器会帮你在进程空间按指明长度申请一段内存,清为0,所以全局变量不初始化一般都是以0填充.常量全局变量和字面值占文件大小,当然,更占内存空间,加载器在加载时,会把这一部分内存设置为只读,所以,一般来说,强制修改一个const 全局变量是会发生内存访问违例的


int main(int argc, char* argv[])
{
  int i=1 ;
  const int j=2;

  int* p=new int[1];

  return 0;
}

这个例子举得不好。这个j是局部变量,是在栈上的,而栈是一个段,操作系统也不能说栈上的这几个字节可写,那几个字节不可写,毕竟这种内存属性至少针对一个页来的。而栈需要存储返回地址等信息,所以比如是要可写的。所以导致j也是可写的。所以这里的const j只是一个语法属性,在内存中j是没有const属性的。

那BSS又属于谁?

梅尚程荀
马谭杨奚







                                                       
2012-07-28 13:18
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
我原来是想弄清楚 栈为什么是允许被修改的 这个问题 ,现在看来栈被修改也是有条件的?

梅尚程荀
马谭杨奚







                                                       
2012-07-28 13:21
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用Devil_W在2012-7-28 12:44:28的发言:

http://www.
里面讲
程序代码:
姑且不论,编译在实现上是不是将 const 修饰的标志符放在符号表中!

当 用定 const 定义一个常量值时,它才是常量,是直接插入指令中的

用 const 定义一个指针变量时, 这个变量可不是一个常量值! 这个指针不是放在他所说的符号表中 

const 变量存储在哪里与const 关键字无关,
const 关键字是一个Type qualifiers,而决定变量存储的是Storage-class specifiers.




这么看来const char *p = "haha"; 的p变量还是存储在栈段上的吧。

梅尚程荀
马谭杨奚







                                                       
2012-07-28 13:27
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 19楼 demonleer
正解,相同的字面字符串只有一个。

My life is brilliant
2012-07-28 15:45
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
各种大神在讨论。
这些概念对于会汇编的人来说不陌生。C 语言讲究语义,不讲究实现。有容 如果不太熟悉这方面的东西,可以自己去查点资料。解释起来还是需要些费些口舌的。
2012-07-28 18:01
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
大致可以这么理解。程序包括可执行的代码和数据。分别放在程序段和数据段。

一般来说只有程序段的代码是可执行的:这样设计可以使得修改返回地址,以执行一段精心设计的数组内的数据是不可行的。
数据段又可以分为只读的读写的。只读的数据就是只能读不能写,用来存各种常量,包括字符串字面。读写的就用来存那些可以写的。

因为这些数据都包装在可执行文件里,所以只有初始化的数据才写在里面。还没初始化的变量,就说是放在一个叫 BBS 的段里。那个段并不编译到可执行文件里,在执行的时候才开辟内存。
你可以试试,开辟一个很大的全局数组。一个不初始化,另一个比如把第一个元素赋值成1,看看生成的可执行文件大小有没有区别。
2012-07-28 18:10
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
关于存在栈里的数据,它一定是可写的,这个没法改变。只是编译器会对加了 const 关键字的东西进行审查。任何对之修改的语句,都会产生语法错误,从而保护它的值。但其实你还是可以改动它的值,方法不用我说 有容 自己试试就知道了。
这个 const 只是在语义上保护程序,以免不小心修改逻辑上不能改的值。但不能防止精心设计的修改(即是说并非利用语义,而是在执行过程中修改它)。
2012-07-28 18:13
快速回复:深入指针笔记二
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018339 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved