重解几道华为经典C语言面试题

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  编辑特别推荐:

  全国计算机等级考试(等考)指定教材

  全国计算机等级考试学习视频

  全国计算机等级考试网上辅导招生

  全国计算机等级考试时间及科目预告

  考试大教育全国计算机等级考试在线测试平台

  全国计算机等级考试资料下载

  全国计算机等级考试论坛

  如何应付二级考试中的公共基础知识

  全国计算机等级考试上机考试应试技巧

  1、找错
  void test1()
  {
  char string[10];
  char* str1="0123456789";
  strcpy(string, str1);
  }
  这里string数组越界,因为字符串长度为10,还有一个结束符‘/0’。所以总共有11个字符长度。string数组大小为10,这里越界了。
  PS:使用strcpy函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。
  void test2()
  {
  char string[10], str1[10];
  for(i=0; i<10;i++)
  {
  str1[i] ='a';
  }
  strcpy(string, str1);
  }
  这里有一个一眼就能看出的问题,那就是变量i没有定义,这在代码编译阶段编译器可以帮你发现,很容易搞定。然而很多问题是自己造成的漏洞,编译器是帮不上什么忙的。这里最大的问题还是str1没有结束符,因为strcpy的第二个参数应该是一个字符串常量。该函数就是利用判断第二个参数的结束符来得到是否拷贝完毕。所以在for循环后面应加上str1p[9] = '/0';
  PS:字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符‘/0’。
  void test3(char* str1)
  {
  char string[10];
  if(strlen(str1)<=10)
  {
  strcpy(string, str1);
  }
  }
  这里的问题仍是越界问题。strlen函数得到字符串除结束符外的长度。如果这里是<=10话,就很明显越界了。
  小结:上面的三个找错的函数,主要是考查对字符串和字符数组的概念的掌握以及对strcpy函数和strlen函数的理解。
  2、找错
  DSN get_SRM_no()
  {
  static int SRM_no;
  int I;
  for(I=0;I<MAX_SRM;I++)
  {
  SRM_no %= MAX_SRM;
  if(MY_SRM.state==IDLE)
  {
  break;
  }
  }
  if(I>=MAX_SRM)
  return (NULL_SRM);
  else
  return SRM_no;
  }
  这里for循环的判断语句是后来我加上的,估计在网上流传的时候被人给弄丢了,根据对程序的分析,给补上了。估计错误应该不是这儿。
  简单的阅读一下这个函数,可以大概的可以猜测出这个函数的功能是分配一个空闲的SRAM块。方法:从上次分配的RAM块后的RAM块开始检测SRAM每个RAM块,看是否是IDLE状态,如果是IDLE则返回当前的RAM块的号SRM_no.如果所有的RAM块都不是IDLE状态,则意味着无法分配一个RAM给函数调用者,返回一个表示没有RAM可分配的标志(NULL_SRM)。
  经过上面的分析,则这里可以知道,这个函数的错误是for循环里面没有给SRM_no这个变量累加1。

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答