BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #7828同步于 2008/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

指针和数组的区别——SUN面试题

flyingmiao
2008/5/30镜像同步34 回复
如果能弄明白这个面试题,基本可以认为明白了指针和数组名的区别 另外转帖一个解释,还算凑合吧,我自己懒得写了,想知道详细的自己看《C专家编程》 ================ /* file1.c */ char buff[128]; /* file2.c */ extern char *buff; /* Notice: extern char buff[] */ int main() { *buff = 'a'; return 0; } 结果如下: $ gcc file1.c -c $ gcc file2.c -c $ gcc file1.o file2.o -o ff $ ./ff Segmentation Fault 问,为何有这个结果? 我试了一下,在file2中换成extern char buff[]就可以, 但不知道为什么了.. 论坛上的一种解释: --------------------- 数组和指针本来是完全不同的东西 数组里面放的是数组元素的值, 指针放的是一个地址 编译器为了处理起来方便,经常把数组当成指针处理 比如: int buf[5]={0}; int *p = buf; 这个时候编译器知道buf是一个数组 所以会把数组的地址而不是它的内容传给p指针 但是如果数组是在另一个编译单元(编译器对每个编译单元的处理是独立的) 指针p它不知道自己指向的是一个数组 链接的时候也没有buf是一个数组的信息 所以最后链接的时候, p链接的是buf的内容而不是它的地址 我在linux下的实验结果 --------------------------------- 在file1.c里边 char buf[ 128 ] = {0x10, 0x20, 0x30, 0x40}; 在file2.c里边 extern int buf // 注意这里强制把file1.c里边的char buf转换成整形 int main() { printf("buf = %x\n", buf ); } 则输出的结果就是 buf = 40302010
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lester98机器人#1 · 2008/5/30
很好,学习了
zhaotong机器人#2 · 2008/6/3
Interested in pearls of QMD of LZ...
fromwithin机器人#3 · 2008/6/3
谁能解释下...
PtwCJ机器人#4 · 2008/6/3
好贴要up
ttfish机器人#5 · 2008/6/5
学习了
SDI机器人#6 · 2008/6/5
最后的例子不存在强制转换一说吧,前面也说了,是链接的问题。 【 在 flyingmiao (amiao) 的大作中提到: 】 : 如果能弄明白这个面试题,基本可以认为明白了指针和数组名的区别 : 另外转帖一个解释,还算凑合吧,我自己懒得写了,想知道详细的自己看《C专家编程》 : ================ : ...................
SDI机器人#7 · 2008/6/5
买本<<C专家编程》吧,这个问题有点绕口令,以前真情上贴过一个SUN ERI的笔试题,里面就有这道。 【 在 fromwithin (drivenfromwithin) 的大作中提到: 】 : 谁能解释下...
diy0829机器人#8 · 2008/6/6
我就知道分配可能不同·~
rebirthatsix机器人#9 · 2008/6/11
【 在 SDI 的大作中提到: 】 : 买本<<C专家编程》吧,这个问题有点绕口令,以前真情上贴过一个SUN ERI的笔试题,里面就有这道。 re 这本里说的相当明白,两者自身的作为左值和右值时效果是不一样的