【问题标题】:Allocating space to a node pointer为节点指针分配空间
【发布时间】:2013-10-18 22:48:42
【问题描述】:

我目前正在尝试使用双向链表对一些数据进行排序。我在使用给定数据创建新节点时遇到问题。以下是给我的代码:

#ifndef LIST_H_
#define List_H_
#define MAX_SYMBOL_LENGTH 7
struct order {
    int id;
    char symbol[MAX_SYMBOL_LENGTH];
    char side;
    int quantity;
    double price;
};

typedef struct order* OrderPtr;
typedef struct onode* NodePtr;

struct onode {
    OrderPtr data;
    NodePtr next;
    NodePtr prev;
};

这是我使用 list.h 作为标题编写的代码。 以下是看似不断崩溃的代码:

#include "list.h"

NodePtr newNode(OrderPtr data){

    NodePtr node = (NodePtr)malloc(sizeof(NodePtr));
    //node->data = (NodePtr)malloc(sizeof(OrderPtr));
    //*node->data = *data;
    node->data = data;//This is the one I am having problems with
    node->next = NULL;
    node->prev = NULL;
    return node;
}

它编译得很好,但是当我尝试将它提交给在线评分者时,它说它不起作用。 这是我的思考过程,

  1. 为 NodePtr 创建内存。
  2. 为 NodePtr->data 创建内存。

然后将函数传递过来的数据的值赋给Node->Ptr中的值。 但是我不知道如何为NodePtr->data分配内存。

【问题讨论】:

  • 让我试试,哈哈,我是这个网站的新手。
  • 您不需要在 C 程序中强制转换 malloc 的返回值。
  • 另外,当引用内联代码时,用反引号括起来会很有帮助,所以`code`会显示为code
  • 当我说 typedef-ing 指针类型只有一个积极属性时,你只需要相信我:它避免了不正确的声明。 NodePtr a,bNode* a,b;。除此之外,没有真正的好处,而且您会发现大多数专业 C/C++ 程序员希望在代码中看到这些星号,而不是将它们隐藏在不需要的 typedef 中,如果没有别的原因的话作为一面巨大的旗帜,上面写着“看!指针!”除非您正在编写一个将指针隐藏为“句柄”的抽象句柄类型系统,否则不要养成习惯。

标签: c linked-list nodes allocation


【解决方案1】:
NodePtr node = (NodePtr)malloc(sizeof(NodePtr));

没有按照你的想法做。它分配空间来保存与sizeof(int* 相同的指针),通常是32 位机器上的4 字节。

您需要使用NodePtr node = malloc(sizeof(struct onode)); 而不是。 data 成员应该是 malloc(sizeof(struct order)); 的结果

另外,don't cast result value from a malloc() call

【讨论】:

  • 好的,我明白了,所以我只调用 malloc 一次?你不是说 struct onode 吗?另一个人说调用onode而不是struct order。尽管感谢您提供链接,但我更好地理解为什么不现在进行投射
  • 他需要的不是sizeof(struct order);它是struct onode 的大小,和许多人一样,我更喜欢简单地使用声明变量的取消引用作为sizeof 参数来确保您拥有正确的类型:即NodePtr node = malloc(sizeof(*node));,它首先避免了 malloc 的错误类型大小。
  • 真的是sizeof(struct onode)。我的错。
  • 所以我在过去一个小时左右一直在努力让我的 newNode 函数工作。你们知道如何复制数据吗?似乎把node->data = data 放在一边是行不通的。我尝试使用memcpy(node-data, data, sizeof(*node),但没有成功。有什么想法吗?
  • 需要贴出调用节点创建的代码,以及数据指针。可能您没有充分分配数据指针,只是使用杂散堆栈:-)
【解决方案2】:

NodePtr 是指向节点的指针,而不是节点本身。您只是为指针分配了足够的内存,而不是为 onode 结构的所有成员分配了足够的内存。你会想用sizeof(struct onode) 打电话给malloc

【讨论】:

  • 您是如何在 cmets 中发布代码的?你知道吗? NodePtr 节点 = (NodePtr)malloc(sizeof(struct onode));是我要实现的,所以只是为了确保我只调用一次 malloc ?
  • 您可以在 ESC 下面使用与 ~ 共享相同键的 '`' 字符。当您键入时,下方会显示一个框,它将告诉您有关其他功能的更多信息。是的,您只需要调用一次 malloc。
  • 非常感谢您的帮助!
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多