两道华为的改错题

zhouhong0801 2007-10-28 09:51:47
1、

void get(char *buf)
{
if(buf==NULL)
{
ASSERT(0);
return;
}
buf = (char*)malloc(SIZE);
return;
}
void Test()
{
char *b=NULL;
get(b);
if(b==NULL)
{
return;
}
strcpy(b,"hello world!\r\n");
printf("%s",b);
free(b);
return;
}


2、

int getmemory(char **buf,int num)
{
if(buf==NULL)
{
ASSERT(0);
return;
}
*buf=(char*)malloc(num);
if(*buf==NULL)
{
return ERROR;
}
return OK;
}
void test()
{
char *str=NULL:
if(getmemory(&str,buf)==OK)
{
cin>>str;
cout<<str;
free(str);
}
return;
}


...全文
1016 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzhg2007 2007-10-31
  • 打赏
  • 举报
回复
没什么意义的问题!
jitongwang 2007-10-31
  • 打赏
  • 举报
回复
1、错误的原因在于,test函数试图通过get函数的指针给指针分配内存。malloc分配的是堆类型,此法不通。应用指针的指针传递参数。而且释放指针后没有让指针等于NULL,产生野指针。
2、改正了第一个的第一个错误,可以传递内存。返回值里的int型没有什么ERROR,OK,得int型,改为-1,0或false,true。同样释放指针后没有让指针等于NULL,产生野指针。还有test函数中buf没有定义。
red_berries 2007-10-30
  • 打赏
  • 举报
回复
没发现什么很怪的地方,不像是华为的面试题.另外free(str)就可以了,不需要free(&str),
inerson 2007-10-30
  • 打赏
  • 举报
回复
第一题:
void get(char *buf) 改成
void get(char *&buf)就行

第二题:
还没看出来
mShopping 2007-10-29
  • 打赏
  • 举报
回复
mzyong说的还靠谱些~~~
mzyong 2007-10-29
  • 打赏
  • 举报
回复
我感觉是内存分配的问题。第一个无法正常工作并会造成内存泄露的问题。
第二个free时应该取地址,
修改一些小的细节如未定义的宏等等
Joseph_friends 2007-10-29
  • 打赏
  • 举报
回复
1.加上一个宏#define SIZE 100
改为小写assert(0);

2.改为小写assert(0);
加上一个枚举enum re_value{ERROR,OK};
ASSERT(0);下面的return 加ERROR
test函数的第一句后面:改为;
test里面定义整型变量buf
Joseph_friends 2007-10-29
  • 打赏
  • 举报
回复
是不是assert(0)小写
redlives 2007-10-29
  • 打赏
  • 举报
回复
而且,由于第二个函数是int型,应该有返回值,而不是return;
redlives 2007-10-29
  • 打赏
  • 举报
回复
第二个:
int getmemory(char **buf,int num)
{
if(*buf==NULL) //buff永远不会是NULL
{
ASSERT(0);
return;
}
*buf=(char*)malloc(num);
if(*buf==NULL)
{
return ERROR;
}
return OK;
}
void test()
{
char *str=NULL:
if(getmemory(&str,buf)==OK)
{
cin>>str;
cout<<str;
free(str);
}
return;
}
proware 2007-10-29
  • 打赏
  • 举报
回复
第一个.改正..
第二个还没有发现...汗...

void get(char **buf) //
{
if(buf==NULL)
{
ASSERT(0);

return;
}
*buf = (char*)malloc(20); //
return;
}
void Test()
{
char *b=NULL;
get(&b); //
if(b==NULL)
{

return;
}
strcpy(b,"hello world!\r\n");
printf("%s",b);
free(b);
return;
}
zhouhong0801 2007-10-29
  • 打赏
  • 举报
回复
补充一下,并回复1楼的朋友,

默认的环境是32位的机器,编译器为VC6
zhouhong0801 2007-10-29
  • 打赏
  • 举报
回复
好像free(str)这样就可以了吧,不需要free(&str)
zhouhong0801 2007-10-29
  • 打赏
  • 举报
回复
补充一下,回复ls的诸位兄弟:

第二题之前是有很多的宏定义,例如OK、ERROR,BUF等等,不过我忘记具体的数字,就没有敲上来。

加上,我想问题的关键点应该在内存分配上面,所以也就忽略了。
baihacker 2007-10-29
  • 打赏
  • 举报
回复
第一个程序不用说了,简单.
第二个程序,
return; 应该加一个返回值
char *str=NULL: 应该是打错了吧
cin >> str; 不安全, 用cin.getline(str, buf);
waterx 2007-10-29
  • 打赏
  • 举报
回复
第二个free(str)不要free(&str)
str是分配的内存首地址,有人搞错了
zhuwuwei 2007-10-29
  • 打赏
  • 举报
回复
第一个问题是编译器会为函数的每个参数制作临时的副本,所以呢你改变的只是一个副本,而并非传进来的那个。但我们经常用指针当参数传给函数,注意我们那时候只是改变了指针所指向的内容,而并非指针本身。
所以第一个可以用char*作为返回值返回一个申请的指针。
第二个我怀疑楼主没敲错吧,其中一个return 没有返回值,函数调用的参数buf很别扭,cin也不安全,另外建议free(str);后加一句str = NULL;
参考文献:高质量C++/C编程指南,作者林锐。
羽中漫步 2007-10-29
  • 打赏
  • 举报
回复
都是在说内存问题,楼上已经说清楚了,补充一下,在FREE后面加上一个赋值语句,这样更加保险。
oldmanzhao 2007-10-29
  • 打赏
  • 举报
回复
第一题:同意楼上,我觉得也是,第一个函数返回后buf又指向之前的地址了。还有为什么不直接ASSERT(buf)呢,void类型也没必要return啊。
Test函数肯定什么也不输出直接返回了。
第二题:assert后面return要有返回值,getmemory的第二个参数有问题,不知道是不是楼主输入错误
mzyong 2007-10-29
  • 打赏
  • 举报
回复
两个题目是考察同一个知识点的吗

#define SIZE 100
void get(char **buf)
{
if ( buf == NULL)
{
_assert(0);
return;
}
*buf = (char*)malloc(SIZE);
return;
}

void main()
{
char *b=NULL;
get(&b);
if(b==NULL)
{
return;
}
strcpy(b,"hello world!\r\n");
printf("%s",b);
free(b);
return;
}
加载更多回复(3)

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧