RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 761113
Accepted
user249284
user249284
Asked:2020-12-21 01:12:29 +0000 UTC2020-12-21 01:12:29 +0000 UTC 2020-12-21 01:12:29 +0000 UTC

(char*)malloc(...)

  • 772

在一些代码片段中,我看到了malloc()转换为(char *)等(int *)。为什么要这样做?

例如:

char *p;
p = (char *) malloc(100 * sizeof(char));
c
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    AnT stands with Russia
    2020-12-21T01:20:50Z2020-12-21T01:20:50Z

    在恐龙时代,C 没有void *. 通用指针的想法void *很晚才出现在 C 中(不是来自任何地方,而是来自 C++)。直到那个时候,它被用作“通用”指针类型char *。该函数malloc返回类型为 的结果char *。在那些日子里,需要将结果malloc从char *指针接收器的特定类型进行隐式转换。在使用准标准 C 编写的代码示例中,包括 K&R 的第一个版本,正是由于这个原因,这种转换无处不在。

    随着类型void *隐式转换为任何指针类型的语言出现,以及随后转换malloc为void *,显式转换的需求已经消失。但是,它仍然可以在很多旧代码中看到。这种转换也迁移到了在第一个 C 标准出现之前编写的 K&R C 的第二版。它。结果,使用K&R书学习的学生从那里“养成”了这种奇怪的习惯,盲目地将其视为“货物崇拜”。

    在现代 C 代码中,这种转换仅在交叉编译的 C-C++ 代码中才有意义,因为 在 C++ 中,指向void *其他类型的指针本身不会强制转换。特别是,例如,在头文件中实现交叉编译的宏和内联函数时。

    (在现代语言规范中使用类型作为 Cchar *中的泛型指针的遗留问题是保证对象表示和类型对齐要求void *必须char *匹配。)


    公平地说,应该注意的是,现代爱好者的一个论点是明确地malloc在 C 代码中呈现结果(不打算用于交叉编译)仍然包含一定的理性颗粒。在像这样的代码中

    T* p;
    ...
    p = (T *) malloc(N * sizeof(T));
    

    如果有人将声明中的指针类型p从T *to 更改U *,但忘记修复内存分配 via ,则编译器将生成有关malloc调用中指针类型不匹配的诊断消息。malloc是的,这是真的。

    但是,防止此类问题的一种更智能的方法是使用具有“类型无关”内存分配的习语

    p = malloc(N * sizeof *p);
    

    它本身将“自动”适应上述类型更改。

    • 16
  2. Alexcei Shmakov
    2020-12-21T01:23:17Z2020-12-21T01:23:17Z

    该函数malloc分配参数中传递的大小的内存块,并返回指向已分配块的第一个字节的指针。返回类型 (void*)- 指向某些数据的指针,无类型指针

    分配的内存块被分配给具有确切类型的指针。因此,我们必须显式地转换(void*)为我们分配给这个块的指针的类型。

    需要注意的是,
    如果您使用 C++ 编译器编译程序,则必须进行显式转换。
    如果您使用 C 编译器编译程序,则可以省略显式转换。

    • 3
  3. Harry
    2020-12-21T01:26:24Z2020-12-21T01:26:24Z

    同意前面的发言者的观点,我将表达我的煽动性想法——因为许多人设法将 C 视为类似于阉割的 C++,并以 C++ 模式编译 C 程序。而且他需要演员...

    所以所有这些转换只是一个噱头,所以编译器不会发誓,这已经成为一种习惯 :)

    是的,它并没有那么糟糕——至少你可以看到malloc内存的确切分配。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5