返回信息流一段程序:
a.cpp
void main()
{
extern int *aa;
int b = aa[0];
}
b.cpp
int aa[3] = {1,2,3};
程序运行崩溃,为什么?
怎么修改我知道,extern int aa[3];
为什么我就不知道了,麻烦各位看看,谢谢
这是一条镜像帖。来源:北邮人论坛 / cpp / #37279同步于 2010/3/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
一段程序今天搞死机了,麻烦各位支支招
liuchaohappy
2010/3/30镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
反汇编看看
【 在 liuchaohappy (超超) 的大作中提到: 】
: 一段程序:
: a.cpp
: void main()
: ...................
【 在 liuchaohappy 的大作中提到: 】
: 一段程序:
: a.cpp
: void main()
: ...................
首先要明确 aa是个符号 是有地址的 链接的时候会用到,假设地址为0x424a30
所以 对a.cpp来说,aa的声明为int *aa; 故对aa = [0x424a30] =1 所以aa[0] => [1] 就错了
对b.cpp来讲 aa的声明为数组aa[],故语义上aa == &aa 所以直接进行地址访问,所以不会出错 即这时候aa[0] == [0x424a30]
【 在 liuchaohappy 的大作中提到: 】
: 一段程序:
: a.cpp
: void main()
: ...................
《c陷阱与缺陷》中有个类似的例子,我也是刚看到。
借用其中大部分,希望对lz有帮助……
上下文环境中数组与指针类似,但毕竟不同。其中一个是int型数组的名称,尽管在一个语句中引用aa,将得到指向该数组起始元素的指针,但aa的类型是字符数组,而不是字符指针。另外一个被确定为指针。这两个对aa的声明使用的存储空间的方式是不同的;它们无法以一种合乎情理的方式共存。
呃~具体请参见上面的参考书。
这个不奔溃就怪了。。。
【 在 liuchaohappy (超超) 的大作中提到: 】
: 一段程序:
: a.cpp
: void main()
: ...................
同
【 在 Vampire 的大作中提到: 】
: 我再一次推荐《C专家编程》……
: --
: 拒绝浮躁
: ...................
非常感谢楼上各位的热心帮助,在各位的热心帮助下,我已经明白了,多谢!!
咱北邮人还是很厉害的,又一次感触哈,呵呵。
我工作已经两年了,周围同事比我工作更长时间,大家都不明白这个问题。
至少就c的理解这一块来说,感觉大家都理解的很深刻!
【 在 liuchaohappy 的大作中提到: 】
: 非常感谢楼上各位的热心帮助,在各位的热心帮助下,我已经明白了,多谢!!
: 咱北邮人还是很厉害的,又一次感触哈,呵呵。
: 我工作已经两年了,周围同事比我工作更长时间,大家都不明白这个问题。
: ...................
难道你们那没有看过 Expert C么.....