C_C 误区三:强制转换malloc()的返回值计算机二级考试

文章作者 100test 发表时间 2009:05:20 12:27:48
来源 100Test.Com百考试题网


  2009年下半年全国计算机等级考试你准备好了没?考计算机等级考试的朋友,2009年下半年全国计算机等级考试时间是2009年9月19日至23日。更多优质资料尽在百考试题论坛 百考试题在线题库
  首先要说的是,使用 malloc 函数,请包含 stdlib.h(C 中是 cstdlib),而不是 malloc.h .因为 malloc.h 从来没有在 C 或者 C 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C 编译器都应该有 stdlib.h 这个头文件。
  在 C 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译。但是在 C 中,这种强制转换却是多余的,并且不利于代码维护。
  起初,C 没有 void 指针,那时 char* 被用来作为泛型指针(generic pointer),所以那时 malloc 的返回值是 char* .因此,那时必须强制转换 malloc 的返回值。后来,ANSI C(即C89) 标准定义了void 指针作为新的泛型指针。void 指针可以不经转换,直接赋值给任何类型的指针(函数指针除外)。从此,malloc 的返回值变成了 void* ,再也不需要强制转换 malloc 的返回值了。以下程序在 VC6 编译无误通过。
  #include <.stdlib.h>.
  int main( void )
  {
  double *p = malloc( sizeof *p ). /* 不推荐用 sizeof( double ) */
  free(p).
  return 0.
  }
  当然,强制转换malloc的返回值并没有错,但画蛇添足!例如,日后你有可能把double *p改成int *p.这时,你就要把所有相关的 (double *) malloc (sizeof(double))改成(int *)malloc(sizeof(int))。如果改漏了,那么你的程序就存在 bug .就算你有把握把所有相关的语句都改掉,但这种无聊乏味的工作你不会喜欢吧!不使用强制转换可以避免这样的问题,而且书写简便,何乐而不为呢?使用以下代码,无论以后指针改成什么类型,都不用作任何修改。
  double *p = malloc( sizeof *p );
  类似地,使用 calloc ,realloc 等返回值为 void* 的函数时,也不需要强制转换返回值。

  特别推荐:

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

  2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛

  2009年全国计算机等级考试报名信息汇总

  2009年NCRE考试有新变化

  2009年全国计算机等级考试-大纲

  2009年上半年全国计算机二级考试试题及答案

  2009年上半年全国计算机等级考试试题答案汇总



相关文章


计算机二级C 惯用法之RAII计算机二级考试
在C 中如何使用调试器逐步跟踪程序计算机二级考试
计算机二级C_C 误区五:检查new的返回值计算机二级考试
计算机二级C_C 误区四:charc=getchar().计算机二级考试
C_C 误区三:强制转换malloc()的返回值计算机二级考试
计算机二级C_C 误区三:强制转换malloc()的返回值计算机二级考试
计算机二级C_C 误区二:fflush(stdin)计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛