为什么我们要转换 malloc 的返回值? [复制]

2024-03-12

有人可以向我解释一下为什么有些程序员在 malloc 前面使用 (char*) 吗?我知道它返回 void 但为什么我希望它只返回 char 内存?抱歉,我只是编程新手。谢谢


无需转换返回值malloc因为它的返回类型是void*.

有人可以解释一下为什么有些程序员使用(char *)在malloc前面?

他们通过强制转换(在好的程序员看来)做错了(很可能)。

As wiki http://en.wikipedia.org/wiki/C_dynamic_memory_allocation says:

malloc returns a void pointer (void *), which indicates that it is a pointer to a region of unknown data type. The use of casting is required in C++ due to the strong type system, whereas this is not the case in C1. The lack of a specific pointer type returned from malloc is type-unsafe behavior according to some programmers: malloc allocates based on byte count but not on type. This is different from the C++ new operator http://en.wikipedia.org/wiki/New_(C%2B%2B) that returns a pointer whose type relies on the operand. One may "cast" this pointer to a specific type:

int *ptr;
ptr = malloc(10 * sizeof (*ptr));               /* without a cast */
ptr = (int *)malloc(10 * sizeof (*ptr));        /* with a cast */
ptr = reinterpret_cast<int *>(malloc(10 * sizeof (*ptr))); /* with a cast, for C++ */
  

进行这样的演员阵容有优点也有缺点.

铸造的优点:

  • 包括强制转换允许程序或函数编译为 C++.
  • 演员阵容允许 1989 年之前的版本malloc最初返回一个char *.
  • 如果目标指针类型发生变化,转换可以帮助开发人员识别类型大小的不一致,特别是当指针声明的位置远离目标指针时。malloc() call.

铸造的缺点:

  • 在 ANSI C 标准下,强制转换为多余的.
  • 添加强制转换可能会掩盖包含标头的失败stdlib.h,其中原型为malloc被发现。在没有原型的情况下malloc,该标准要求 C 编译器假设malloc返回一个 int。如果没有强制转换,则将此整数分配给指针时会发出警告;然而,通过强制转换,不会产生此警告,隐藏了一个错误。在某些架构和数据模型上(例如 64 位系统上的 LP64,其中 long 和指针是 64 位,int 是 32 位),此错误实际上可能会导致未定义的行为,因为隐式声明malloc返回 32 位值,而实际定义的函数返回 64 位值。根据调用约定和内存布局,这可能会导致堆栈崩溃。在现代编译器中,这个问题不太可能被忽视,因为它们统一生成警告,指出已使用未声明的函数,因此仍然会出现警告。例如,GCC 的默认行为是显示一条警告,内容为“内置函数的不兼容隐式声明”,无论强制转换是否存在。
  • 如果指针的类型发生更改,则必须修复其中的所有代码行malloc被调用并投射(除非它被投射到typedef).

1. Emphases are mine.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们要转换 malloc 的返回值? [复制] 的相关文章

随机推荐

  • Maven中如何处理生成源的依赖关系?

    在过去的几天里 我一直在尝试使用以下命令将 REST API 客户端的代码生成到我的项目中 openapi generator maven plugin 然而 Maven 失败了compile 一旦意识到生成的代码刚刚引入的第三方依赖项尚未
  • 使 zsh 从文件中获取完整参数

    zsh很棒 但它的完成系统非常多样化 并且文档缺乏好的示例 是否有用于完成特定应用程序的模板 补全将从文件中获取其匹配数据 并用换行符分隔 我尝试修改我的一个旧示例 该示例将匹配数据 实时 cat zsh completers jazzup
  • Java8 - 显式类型如何匹配一种变体 - 而不是其他类型?

    我有一个简单的片段如下 我提到this https jira mongodb org browse JAVA 2010 List
  • 使用 Javascript / Jquery 滚动到页面上的特定位置[重复]

    这个问题在这里已经有答案了 可以使用以下命令移动到页面上的某个位置 elementId 我怎样才能使用 Javascript Jquery 做同样的事情 当调用 JS 函数时 我想滚动到该页面上的特定位置 经过多次谷歌搜索后 我发现你只需要
  • ruby: `read': File.read 处的参数无效 -(Errno::EINVAL)

    我正在做一个简单的脚本来检查所有文件的 crc require zlib exit if Object const defined Ocra files Dir glob File open dir txt a do file file p
  • 了解触摸事件

    我正在尝试让我的一些库与触摸设备一起使用 但我很难弄清楚它们是如何支持的以及它们是如何工作的 基本上有5个触摸事件 https developer mozilla org en US docs DOM Touch events 但移动浏览器
  • C#中访问内存地址

    我正在与 ActiveX 组件交互 该组件为我提供内存地址和字节数 如何编写 C 程序来访问从给定内存地址开始的字节 有没有一种方法可以本地实现 或者我必须与 C 接口 ActiveX 组件和我的程序是否共享相同的内存 地址空间 您可以使用
  • THREE.BufferGeometry - 访问面索引和面法线

    在 BufferGeometry 中 有没有一种方法可以访问面索引和法线而不转换为几何图形 手头的几何体是由 Threejs 编辑器创建的 SphereBufferGeometry 我只需要读取面部索引和法线 而不需要修改它们 Buffer
  • Google 结账通知确认失败

    我有一个被调用的回调 url 我可以处理它 但是 Google 不会处理我的确认 这一切都在EnvironmentType Sandbox 在 Google 结帐 集成控制台 中 我收到以下消息 我们在处理您的通知确认时遇到错误 我们得到的
  • 使用 ItemTouchHelper 时,如何在拖动时取消对 RecyclerView 中项目的拖动?

    背景 我试图拥有一个具有不同视图类型的 RecyclerView 但具有拖放功能以及单击和长按操作的能力 它与 电话 应用程序类似 您可以在其中更改收藏夹项目的顺序 在 电话 应用程序上 当您长按某个项目时 会立即出现上下文菜单 如果继续拖
  • 配置器中的组合数量

    我被要求编写一个例程来决定产品配置器中可能的组合数量 配置器非常简单 尽管它具有比这更多的功能 但它可以建模为多个 单选组 如 UI 控件 其中必须选择 n 个选项之一 唯一可以使用的约束是规则 如果选择了一个选项 则不能选择另一个选项 所
  • Pandas 两个分组的 DataFrame 列的简单关联

    有没有一种好方法来获取两个分组的 DataFrame 列的简单关联 看来无论熊猫怎样 corr 函数想要返回一个相关矩阵 例如 i pd MultiIndex from product A B C np arange 1 11 1 name
  • 如果 url 不包含某些字符串,则 htaccess 重定向

    我想将所有传入请求重定向到另一个网址 如果它不包含 和 admin 我需要它用于 angular js 但我有 admin 和 php 例如 http example com link to article http example com
  • JavaScript 检测/浏览器统计

    这个问题已经被问过几次了 但我认为仍然值得与你们核实以获得更多意见 我的所有网站都使用 Google Analytics 进行统计 由于它依赖于 JavaScript 我认为检查有多少人在其浏览器中启用 禁用了 JS 是很重要的 我记得我经
  • 如何从 Azure 数据工厂连接到 Firebird/InterBase (Syntess) 数据库?

    在 ADF 中 我创建了一个管道 源是 ODBC 表或查询 下一步是创建链接服务 集成运行时已创建并选择 如下所示 现在问题来了 我应该输入什么连接字符串 尝试与Server 192 168 1 35 Database dbname DSN
  • Tomcat - 如何指定可以在 server.xml 中扩展的属性

    目前 我的 server xml 中有
  • 用Java从视频中获取缩略图

    我想从 servlet 或任何其他服务器端 Java 方法中的视频创建缩略图 视频文件上传到服务器上 上传后应创建缩略图 我的问题不是创建缩略图 而是仅创建一个或一定数量的缩略图 到目前为止我的代码 public class Test pu
  • __format__ 方法应该如何用于 int?

    我看到有一个 format 方法但有帮助 int format 不提供任何帮助 我也知道你不应该打电话给 method 直接地 什么时候调用这个方法 它的论据是什么 它用于 Py3k 的新字符串格式化方案 您可以在这里找到更多信息 http
  • 我应该将所有项目存储在一个还是多个存储库中?

    我目前正在使用 TortoiseSVN 来管理我目前正在进行的几个项目 当我第一次将所有内容移至源代码管理中时 我不太确定应如何布置所有内容 因此我最终将每个项目放入其自己的存储库中 我想知道将它们全部移动到一个大存储库中并将它们分成项目文
  • 为什么我们要转换 malloc 的返回值? [复制]

    这个问题在这里已经有答案了 有人可以向我解释一下为什么有些程序员在 malloc 前面使用 char 吗 我知道它返回 void 但为什么我希望它只返回 char 内存 抱歉 我只是编程新手 谢谢 无需转换返回值malloc因为它的返回类型