0

我更改了代码,将 memcpy 移到了 if 语句中,但我仍然得到同样的错误。

** * 返回一个用给定顺序填充的新链表节点,函数 * 分配一个新顺序并复制存储在数据中的值,然后分配一个 * 链表节点。如果您正在实现此功能,请确保您 * 复制,因为原始数据可能会被调用函数修改。*/

struct order 
{
        int id;
        char side;
        int quantity;
        double price;
};

struct onode 
{
        struct order* data;
        struct onode* next;
        struct onode* prev;
};


    struct onode* newNode (struct order* data)
    {
        struct order* dataValue  = (struct order*) malloc(sizeof(struct order));
        struct onode* linkedlist = (struct onode*) malloc(sizeof(struct onode));


        if(data != NULL)
        {
            linkedlist ->data = dataValue;
            memcpy(dataValue, data, sizeof(*dataValue));
        }

        else
        {
            return NULL;
        }

        linkedlist->prev = NULL;
        linkedlist->next = NULL;

        return linkedlist;

    }
4

3 回答 3

1

问题不在您显示的代码中。当这样称呼它时:

struct onode * mylist;
struct order * data = malloc(sizeof(struct order));
data->id = 4;
data->price = 20.11;
data->quantity = 3;
data->side = 'a';
mylist = newNode(data);

该列表mylist是使用包含在 中设置的值的节点正确生成的data。我怀疑您用来生成列表的代码与我上面显示的不同。


编辑:对你的“错误”

测试失败:-------------------------------- ------------------------
您的 newNode 似乎已经崩溃了!有了这个问题,我们就无法测试您的其余代码。
你必须先解决它!

这不是这里任何人都可以调试的错误。无论您的学校使用什么工具来验证您的代码,都期望得到与您提供的不同的东西。如果您没有任何其他文件,我会询问 TA。


EDIT2:您不必担心一次处理一个值,因为您的memcpy()

memcpy(dataValue, data, sizeof(*dataValue));

这将获取您设置的所有内容data并将这些值放在正确的位置dataValue。在我的示例(上图)中,我将 4 设置为 4,将id3 设置为quantityetc。在memcpy()调用之后,现在两者dataValuedata都将设置所有相同的值。它将值复制datadataValue. 得到它?

于 2013-03-11T17:23:08.387 回答
0

几点建议:

  • 如果数据为 NULL,您应该在例程开始时返回以避免分配内存,如果数据为 NULL,您将忽略。

  • memcpy 行是正确的,但更改 sizeof 的语法可能更清晰,因此很清楚正在复制多少内存:

    memcpy(dataValue, data, sizeof(struct order));

  • 您实际上并没有将设置数据放在 onode 中,我怀疑您需要以下行:

    链接列表->数据=数据值;

正如您在评论中询问的那样,您还可以填写新的结构顺序:

dataValue->id = data->id // etc.

然后您可以进行比较:

if (data->id == linkedList->data->id) {
    /* It matches */
}
于 2013-03-11T17:30:45.820 回答
-1

您以数据为源调用 memcpy,但在下一条语句中,您测试数据是否不为空。这告诉我空数据指针是可以接受的,在这种情况下 memcpy 会崩溃。您可能需要在此处重新排列语句的顺序。

顺便说一句,你有没有通过你的调试器运行这个?

于 2013-03-11T17:21:28.817 回答