gpt4 book ai didi

C - 像这样使用 malloc 有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:59 24 4
gpt4 key购买 nike

typedef struct node node;

// LinkedList data structure to hold characters.
struct node {
char character;
node *link;
};

稍后我尝试:

node *tmp = malloc(sizeof (node));

我的文本编辑器出现错误:

clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
error: cannot initialize a variable of type 'node *' with an rvalue of type 'void *'
node *tmp = malloc(sizeof (node));
^ ~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[Finished in 0.1s with exit code 1]

我在 Xcode 中遇到了同样的错误,但它在终端中使用 gcc 可以正常工作和编译。怎么会?

提前致谢。

最佳答案

malloc 返回类型 void *。你想要的是将 void * 的原始缓冲区转换为节点 *。

通过在 malloc 之前添加 (node*) 强制转换,您正在使用 C 风格强制转换。在 GCC 中,编译器会自动将未转换的内存匹配到 node*。不过,这不是 C++ 编译器的标准行为。同时,如果您通过添加 -Wall 选项打开警告,您应该会看到错过类型转换的警告。

在这方面,CLang 比 GCC 严格一点。它基本上不允许任何不在标准和 Apple 衍生标准内的事情。

要正确解决这个问题,您需要

  1. 在 malloc 之前添加 (node *) cast
  2. extern "C"{ ... } 子句包裹整个代码体。
  3. 如果需要,使用 #ifdef 确定编译器是否为 c++ 编译器。

这将确保编译器理解代码是 c 代码并且类型转换将正确执行。

关于C - 像这样使用 malloc 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com