`
dogasshole
  • 浏览: 845017 次
文章分类
社区版块
存档分类
最新评论

一道C语言题

阅读更多

结果是死循环,想想看究竟发生了什么?

#include "stdio.h"

int *p = NULL;

int *fFun(void)
{
int i = 0;
return &i;
}

void subFun(void)
{
(*p)--;
}

void gFun(void)
{
int j;

for(j = 0;j<10;j++)
{
subFun();
printf("%d/n",j);
}
}


int main(void)
{
p = fFun();
gFun();
}

另附:

1.下面这个程序的输出结果是什么(你应该很眼熟,就是在这个论坛里拷的:))?
#include <stdio.h>
int main(int argc,char **argv)
{
int count = 4;
int k;
int i = 0xFEDCBA98;
unsigned char * ptr = (unsigned char *)&i;

for(k = 0;k<4;k++)
{
printf("content at adress %p: 0x%x/n",ptr,*ptr);
ptr++;
}
return 1;
}
2.对于一段程序你想知道他的运行结果你会采取什么手段?
a.用编译器手册来解释。
b.编一段程序在机器上跑。
c.用标准来解释。
3.C语言=C语言的实现吗?

很显然,出题的人没分清楚什么是语言什么是语言的实现(programming language and programming implementation)。C语言的标准化已经做的很完善了,但不至详细得于连局部变量是如何实现的都作出规定。其实C语言的对象布局是最简单的(接近于汇编),但正因为简单,容易令程序员在自以为正确的情况下犯错误。我不止一次看到过某些高手认为结构体中的变量的排列是顺序的并且是连续排列的,结构体的大小等于各成员变量大小的合计......。下面有一句话,虽然是说C++实现的,但是对于C我想同样适用。
The C++ standard does not mandate details such as the ordering of either base class subobjects or of data members across access levels. Neither does it mandate the implementation of either virtual functions or virtual base classes; rather, it declares them to be implementation dependent.
----------《Inside the C++ Object Model》
考官拿一个本身有毛病的程序来考人,只是在向人们展示什么叫做“无知的胆大”。

以前曾经遇到过一个公司,发现他们的项目中对结构的使用太大胆了(或者说是无知),项目是一个client/server模型的,client copy一个struct到报文里面,然后通过tcp/ip发给server,server收到后把这个struct拷贝出来,拿一个结构指针指向这个拷贝,接着就用这个结构指针去访问结构中的成员变量了。我看到了第一个感觉就是震惊。这样做问题太多了,首先是client/server的bit顺序和byte顺序的问题,其次是编译器对结构布局的问题。如果client/server用的是同样的cpu,os,编译器,OK,这样做绝对不会出问题,但是这几乎是不可能的。
我前面出了一道题:
对于一段程序你想知道他的运行结果你会采取什么手段?
a.用编译器手册来解释。
b.编一段程序在机器上跑。
c.用标准来解释。
这道题是出自Programming Languages Design and implementation。书中说到,大部分人会采取a.b两种方式解决问题,“极少人”会采取c方式。当有异议的时候还是拿出标准来说话,微软是软件的老大,但是也避免不了要吃官司,不要在“权威”面前屈服,这是我做人的哲学。今天先说到这里,下次有空我用C standar去解面试那道题。我先把C/C++ standar传上去,本版的那个C standar是没有书签的,我这个排版要好些。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics