Programming 板


LINE

※ 引述《hansi (Jamie)》之铭言: : 请问以下程式的问题是那边呢? : 1. : #include <stdio.h> : void main(void) : { : char *pt; : *pt = 'a'; : getchar(); : } : 用了Devcpp 跟visual studio express 2008 compile都会过 : 不过run的时候就crash了 : 後来改成 但是应该有 warning,比如 VC 应该是会给: warning C4700: 使用了未初始化的区域变数 'pt' 就跟你写 int i; prinitf("i = %d", i); 一样,还没给过任何值就在取值。 : 2. : Char *pt,ch; : ch = 'a'; : pt = &a; : getchar(); : 这样才可以 : 想请教一下为何不能像1这样使用呢? : 因为手边有两本c的书(蛮老的)里面都有1这样的例子, : eg: int *pt = 0; 不过我run这个也是会crash : 一开始我以为是电脑有问题,後来试了其他两台也一样 也许是因为你用的电脑上面,刚好有个作业系统,刚好有在管理记忆体,刚好把记忆体 位址划分成 某段位址(假设是0~127) 唯读,除此之外其他位址可读取及写入。 然後你的 pt 因为你没有给任何值,所以编译器让 pt 随便得到某个值,假设是0。 因为 0 属於唯读的区域 然後你 *pt = 'a'; 代表把 'a' 这个 byte 写入到0去,但这段程式码在程式执行时 才会跑到,所以你通过了编译,但执行时才被抓包。 但是你用的书,刚好他们那个时代根本没有在管记忆体位址哪些只能唯读、哪些能读写 (DOS真实模式时代?) -- 补充一下流程,没全部查证,可能有误 假设你有个程式档 1.c 里写 char *pt; pt = 'a'; //如果你编译成C语言,只会有警告,但是编译成C++,就会直接给编译错误 pt = "a"; //电脑会夸奖你...其实不会 'a' 编译器会把他转成一个整数数值,也就是 ASCII code 对应 a 的整数 0x61。 所以 pt = 'a'; 跟 pt = 0x61; 是一样的语意 "a" 编译器会把他当作一个常数字串,总共有 2 bytes 这麽大,数值是 0x6100 因为这两个 byte 彼此是独立的个体,所以不需要考虑什麽 endian 的议题。 然後编译器会把 0x6100 存在他生成的档案 1.obj 里面,在里面会分成好个区域 会有其中一个被叫 .rdata 的区域 (section),里面的内容就拿来放这个常数字串 的值也就是放 0x6100 (0x61 会在记忆体位址比较低的那一边,0x00会紧邻在高位址的旁边) 然後会有连结器,把1.obj跟其他目的档连结在一起,产生出 1.exe 这个执行档 当你点两下执行 1.exe 时,作业系统就把1.exe的内容搬到主记忆体去。 也就是说现在常数字串"a"也存到主记忆体去了,你想要找他就要透过主记忆体的 位址去找,而不是打开磁碟里的档案1.obj去找。 而为了让这个字串不是光放着没人用,在 pt = "a"; 这里时,就会传回这个常数字串 的记忆体位址 (rvalue) 给变数 pt 去存放。 那这是在编译时就要决定的位址,所以这里给的是虚拟的位址假设就是「0跟1」, 按照惯例都是用比较低的记忆体位址当代表,也就是用0当地址代表。 (可以用IDE下中断点来观察pt存放了什麽位址) 当作业系统执行1.exe时,才再做记忆体位址重定位的功能。 比如OS把你载入到位址200以後的一段空间,则pt的位址就会被重定位为200。 以後只要执行 cout << pt; 就能透过 pt 里面存的记忆体位址读出这个常数字串来。 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 124.8.131.6 ※ 编辑: zlw 来自: 124.8.131.6 (06/14 17:33)
1F:推 chrisdar:\0 123.195.88.23 06/14 19:29







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP