中兴面试C语言题1

发信人: 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程序最忌讳的事情了吧?

你可能感兴趣的:(C++,c,面试,C#,中兴)