`
VincentZheng
  • 浏览: 52275 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】C/C++ 误区三:强制转换 malloc() 的返回值

    博客分类:
  • C
 
阅读更多
首先要说的是,使用 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* 的函数时,也不需要强制转换返回值。

参考资料:

ISO/IEC 9899:1999 (E) Programming languages — C 7.20.3.3 The malloc function
ISO/IEC 9899:1999 (E) Programming languages — C P104 (6.7.2.2)
分享到:
评论

相关推荐

    C语言难点分析整理

    69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件...

    免费下载:C语言难点分析整理.doc

    C/C++ 误区三:强制转换 malloc() 的返回值 这部分解释了为什么不应该强制转换`malloc()`的返回值。 ### 70. C/C++ 误区四:char c = getchar(); 这部分解释了为什么`char c = getchar();`可能会导致问题。 ### ...

    高质量C/C++编程指南

    - **参数规则、返回值规则和函数内部实现规则**:函数是C/C++中实现功能的基本单元,本部分讲述了如何设计参数、返回值以及函数内部的实现方式,并提供了一些实际建议,比如使用断言来确保函数执行的正确性。...

    高质量c/c++编程

    通过学习《高质量C/C++编程》,开发者可以避免常见误区,提升编程技能,编写出更高质量、更易于维护的代码。书中的每一个章节都是实际编程经验的结晶,对于任何C/C++开发者来说,都是一份宝贵的资源。

    林锐,高质量C /C++编程手册

    ### 林锐,《高质量C/C++编程手册》关键知识点概览 #### 1. 文件结构与版本控制 - **文件标识**:明确指出文档的版本为1.0,由林锐博士编写,已完成并正式发布于2001年7月24日。 - **版本历史**:详细记录了文档从...

    高质量C/C++编程指南doc

    ### 高质量C/C++编程指南知识点概览 #### 一、文件结构 - **版权和版本声明**:强调在每个文件的头部都要有明确的版权和版本信息声明,包括作者、版本号、创建日期等关键信息。这样做有助于追踪文件的历史变更记录...

    高级C语言 学完C语言来看这个绝对收获

    C/C++误区三:强制转换malloc()的返回值 强制类型转换`malloc()`的返回值可能会导致类型不匹配的问题。 #### 66. C/C++误区四:charc=getchar(); `getchar()`读取单个字符,通常不需要显式类型转换。 #### 67. ...

    高质量 C/C++编程指南.pdf

    《高质量C/C++编程指南》由林锐博士撰写,是一份详尽的编程规范文档,旨在指导软件开发者如何编写高质量的C/C++代码。这份指南不仅涵盖了基础的编程规范,如文件结构、程序版式、命名规则等,还深入探讨了更复杂的...

    高质量C++/C 编程指南PDF

    ### 高质量C++/C编程指南知识点梳理 #### 一、文件结构 - **版权和版本声明**:明确指出代码或程序的所有权,并记录版本信息,有助于追踪修改历史及版权归属。 - **头文件结构**:规范头文件的编写方式,确保其一致...

    高质量C++-C编程指南

    ### 高质量C++-C编程指南知识点梳理 #### 前言 - **目标**:本书旨在帮助读者深入理解并掌握C/C++编程的核心原则和技术细节,避免常见错误,提高编程水平。 - **读者反馈**:根据过往读者的经验,初次接触本书可能...

    高质量C++编程指南

    - **有了MALLOC/FREE为什么还要NEW/DELETE**:解释了C++中`new`/`delete`相较于`malloc`/`free`的优势,如类型安全和构造函数调用。 - **内存耗尽怎么办**:提供了内存耗尽时的处理策略,如增加内存配额等。 - **...

    高质量C++C编程指南

    ### 高质量C++/C编程指南:提升代码质量和可维护性的宝典 #### 引言:编程老手与高手的误区 林锐博士撰写的《高质量C++/C编程指南》不仅是一份技术手册,更是一部揭示了编程老手与高手间差异的深刻洞见。书中提及...

    C++编程指南.

    通过阅读《高质量C++/C编程指南》,读者可以了解到C++/C编程的各个方面,并掌握如何编写出高质量、可维护性强的代码。该指南不仅涵盖了基本语法和编程习惯,还深入探讨了面向对象编程的原则和技术,为程序员提供了...

    高质量程序设计指南C++-C语言(经典第1版)林锐.pdf

    《高质量程序设计指南C++-C语言(经典第1版)林锐》是由林锐博士编写的经典书籍,书中详细介绍了编写高质量C++和C语言程序的规则和建议。本书不仅适用于初学者,同样也对经验丰富的程序员有着重要的参考价值。书中不仅...

    高质量C_C++编程指南

    ### 高质量C/C++编程指南知识点概览 #### 一、文件结构 - **版权和版本声明**:为了确保程序的合法性和可追溯性,每个文件都应该包含版权信息和版本声明,明确指出作者、创建日期及版本号等关键信息。 - **头文件...

    高质量C++/C编程指南

    ### 高质量C++/C编程指南核心知识点详解 #### 一、文件结构与文档管理 - **版权和版本声明**:确保每份文件都包含了版权信息和版本号,这有助于追溯文件的历史变更记录和版权归属。 - **头文件结构**:规范头文件的...

Global site tag (gtag.js) - Google Analytics