我更改了代码,将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;

    }

最佳答案

问题不在于您显示的代码中。当这样调用时:

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似乎崩溃了!鉴于此,我们无法测试您的其余代码。您必须先修复它!


这不是任何人都可以调试的错误。无论您的学校使用哪种工具来验证代码,都期望与您提供的工具有所不同。如果您没有其他文档,我会问助教。



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

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


这将占用您在data中设置的所有内容,并将这些值放在dataValue中的正确位置。在上面的示例中,我为id设置了4,为quantity等设置了3。在memcpy()调用之后,现在dataValuedata都将设置所有相同的值。它将data中的值复制到dataValue。得到它?

10-04 11:54
查看更多