华为一道面试题!!!求助!

今天去华为面试,被拒。
有一道题觉得很冤枉,现在求助强人帮忙解答
下面这个程序哪里错了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getmal(char **p,unsigned long len)
{
*p=(char *)malloc(len+1);
return (p?1:0);
}
main()
{
int len=100;
char *p=0;
char *str="helloworld!";
int i;
i=getmal(&p,len);
sprintf(p,"%s",str);
printf("%s\n",p);
}
面试官说里面有不止两个错误,让我找出来两个就可以,结果我找了近十分钟也没有找出来一个错误!!!
真正的原题是这样的:
int getmal(char **p,unsigned long len)
{
*p=(char *)malloc(len+1);
return (p?TRUE:FALSE);
}
main()
{
int len=100;
char *p=0;
char *str="helloworld!";
getmal(&p,len);
sprintf(p,"%s",str);
}
我加上头文件和最后的printf只是为了调试方便,如果这个题的正确答案是没有引入头文件和没有定义TRUE和FALSE这两个全局变量,就当我瞎了眼,找工作找错了地方!

第1个回答  2013-03-09
上面的函数定义是unsigned long len,但是后面实参传递的是int,这个是错误之一,有些编译系统int和int unsigned long分配内存相同则不报错不同则报错,属于不规范;
char *p=0;函数定义的是char **p是指向指针的指针,也属于实参与形参不对应,编译不报错的原因是,传递的地址所以不报错,同样属于不规范,但是,函数调用后执行此语句*p=(char *)malloc(len+1);相当于直接对0单所存储数值(这里应理解为地址)所指向单元进行操作,直接将数值赋给指针变量P属于高风险语句,易造成系统崩溃,因为你不知道0单所存储数值(这里应理解为地址)所指向单元中是否存储系统重要数据还是闲置,);

本人很久没有写程序了,或许说得不对,见谅
第2个回答  推荐于2018-04-12
注意TRUE和FALSE并不等同于1和0,
还有return (p?TRUE:FALSE);应该改为return (*p?TRUE:FALSE);本回答被提问者和网友采纳
第3个回答  2008-11-12
我不懂程序,看你说的像看天书。
但是看到你的问题补充,我想可能就是你说的这个原因。
从心理学角度分析,认真严谨的工作态度应该对任何细微普通的地方都不放过。
相似回答