中兴面试C语言题1

博客围绕中兴面试的一道C语言程序题展开讨论,该程序涉及指针操作。大家对程序是否有错看法不一,有人指出loop为4时会越界,也有人认为严格说没错。不同编译器和系统下运行结果不同,还探讨了内存分配、指针指向等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发信人: thebestone (Simple life), 信区: C
标 题: 【合集】中兴面试C语言题
发信站: 饮水思源 (2002年01月20日17:20:51 星期天), 站内信件

☆──────────────────────────────────────☆
assembly (assembly) 2001年11月13日11:13:42 星期二 提到:

〖 以下文字转载自 job 讨论区 〗
〖 原文由 jackjun 所发表 〗

发信人: ldldld (流云), 信区: Career
标 题: 中心面试c语言题,我没答出来
发信站: BBS 水木清华站 (Mon Nov 12 15:38:17 2001)

请问下面程序是否有错
int loop;
int a[5],*p;
void main()
{
p=a;
for(loop=0;loop<5;loop++)
{
p++;
*p=loop;
}
}

☆──────────────────────────────────────☆
thinker (thinker) 2001年11月13日11:16:15 星期二 提到:

loop==4 时候越界


☆──────────────────────────────────────☆
legendcorba (legendcobra) 2001年11月13日11:24:27 星期二 提到:

严格说来,也没有错呀。

☆──────────────────────────────────────☆
assembly (assembly) 2001年11月13日11:29:58 星期二 提到:

试了一下
freebsd4.3 loop>=2667出错
mandrake 8.0 loop>=624出错
debian 2.2.19 loop>=627出错
win2000 msvc6 loop>=5出错
似乎m$的检查更严格


☆──────────────────────────────────────☆
assembly (assembly) 2001年11月13日11:32:49 星期二 提到:

win2000下,执行时显示访问内存错误


☆──────────────────────────────────────☆
rabbit (Victor) 2001年11月13日12:31:27 星期二 提到:

能详细说一下“越界”是怎么回事吗?


☆──────────────────────────────────────☆
helic (大恶人) 2001年11月13日13:27:11 星期二 提到:

我在2000下也跑了一遍, 没有问题的说。 不过直接写指针总是不好的啦。改成像
*(p+loop)=loop;会比较规范。


☆──────────────────────────────────────☆
howe (无痕) 2001年11月13日13:32:14 星期二 提到:

你没有被录取
这个程序的赋值结果不会符合编程者的原意.
编译后运行会不会出错与编译器极其设置有关.
就算运行不出错,最后p很有可能指向地址0x4.


☆──────────────────────────────────────☆
helic (大恶人) 2001年11月13日14:00:09 星期二 提到:

不会指向0x4. 编译器在分配内存给int a[5]的时候不会分配到0, 除非内存不够了。而
p是指向这段内存的。也不会指到0x4去吧。


☆──────────────────────────────────────☆
law (游戏*人生) Tue Nov 13 14:23:54 2001) 提到:

hehe, 有可能是p = 4
也有可能是total = 4;
这要看编译器怎么在栈里放局部变量了。


☆──────────────────────────────────────☆
howe (无痕) 2001年11月13日14:26:11 星期二 提到:

loop==4时,对*p的赋值是越界的,但是
如果编译器分配内存时连续分配的话
a[5]就是p, 所以此时*p就是p,也就是说,
此时p指向的就是自己的地址
这时给*p赋值4,就把p指向了0x4


☆──────────────────────────────────────☆
helic (大恶人) 2001年11月13日15:30:07 星期二 提到:

不好意思,是我没有看仔细,再看了一遍, 当loop==4时, p指向a[5], 而不是a[4],
这样的程序真令人ft.


☆──────────────────────────────────────☆
victor (victor) 2001年11月13日15:35:13 星期二 提到:


谢谢提醒,刚才我也没看明白,以为还在a[4]呢
现在懂了


☆──────────────────────────────────────☆
huaihuai (坏坏◎/\◎不要离我太近!) 2001年11月13日15:42:06 星期二 提到:

nod.本来我在job板也是这么说的,
后来一位老兄硬是指摘偶的不是,害的我不得不学习了一下cygwin下
gdb的用法,结果发现有时候即使指针指到a[7]也不会出错,
原来是因为cygwin下面的gcc在分配变量内存的时候会按16字节节对齐,
估计其他编译器也可以这样。而且记得好像有#programma语句或者
是编译开关可以关掉节对齐的。那样就……。


☆──────────────────────────────────────☆
robinhan (无情网客) 2001年11月13日17:44:48 星期二 提到:

不可能。我试过的可以啊。没错呀。

☆──────────────────────────────────────☆
yuanziying (小元) 2001年11月13日20:13:53 星期二 提到:

恐怕中心面试的人也不会想到那么多。



☆──────────────────────────────────────☆
bgee (★★★★★) 2001年11月16日11:20:36 星期五 提到:

当p=a时,表示指针p指向数组a的这一事实。

当loop==4时,p却指向了数组a之外去了。

也许这是C程序最忌讳的事情了吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值