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

时间:2014-03-14 17:27:18

标签: c xcode malloc

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可以正常编译。怎么样?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

在这方面,CLang比GCC要严格得多。它基本上不允许任何不符合标准和Apple衍生标准的内容。

要正确解决此问题,您需要

  1. 在malloc
  2. 之前添加(node *)强制转换
  3. extern "C" { ... }子句包装整个代码体。
  4. 如果需要,使用#ifdef来确定编译器是否为c ++编译器。
  5. 这将确保编译器理解代码是c代码并且类型转换将正确执行。