【问题标题】:Struct allocated with malloc, why? C++ code analysis [closed]用malloc分配的结构,为什么? C ++代码分析[关闭]
【发布时间】:2014-04-15 17:23:38
【问题描述】:

行:

struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));

为什么要实例化的新结构涉及 malloc(为结构的大小分配内存块)?

还有,重新声明struct是不是多余?

以下内容不会完成相同的任务吗?

Node* newNode = new Node; 

模式代码如下:

#include <stdio.h>
#include <stdlib.h>

struct Node
{
    int data;
    struct Node* next;
};

struct List
{
    struct Node *head;  // pointer to head node of list
};

//creates a new list Node
struct Node* newListNode(int data)
{
    struct Node* newNode =
            (struct Node*) malloc(sizeof(struct Node));
    newNode->dest = dest;
    newNode->next = NULL;
    return newNode;
}  

【问题讨论】:

  • 因为它是用 C 编写的,而 C 不知道new,可能到处都需要struct
  • 这不是惯用 C++,而是合法 C++。代码可能是由 (1) 比 C++ 更了解 C 的人编写的,或 (2) 想在 C 库和 C++ 中使用此源代码的人,或 (3) 某些类似情况。 如果您想知道他们为什么这样写代码,请询问编写代码的人。我们不介意读者。
  • 这段代码在我看来像纯 C
  • 如果它是纯 C,那么它不会(或至少不应该)对 malloc 的结果进行强制转换。
  • @BenVoigt:无论如何,将 C 编译为 C++ 并不总是合适的。语义上的根本差异(例如前面提到的标记命名空间)使得将 C 编译为 C++ 充其量只适用于微不足道的情况。 const 文件范围的标识符在 C 中具有外部链接,但在 C++ 中没有。 sizeof('a') 产生不同的结果等等。

标签: c++ c list struct


【解决方案1】:

你问

Node* newNode = new Node; 不会完成同样的任务吗?

不,这在某些非常重要的方面并不等同。如果这个函数的部分接口(契约)是它返回一个可以传递给free()的指针,那么用new实现它就会违反该契约。

此外,struct 关键字的重复重复使用表明已努力确保此代码正确编译为纯 C 和 C++。

【讨论】:

  • 实际上,重复重复使用 struct 关键字表明要努力确保此代码在 C++ 编译器中正确编译。 C 编译器自动将 void* 强制转换为任何指针类型。
  • @oopscene:这不是 C 代码。根据问题,它出现在C++编译单元中。
猜你喜欢
  • 2015-11-09
  • 2014-01-09
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多