newNode坏了。无法搞清楚什么是错的?

时间:2013-03-11 17:05:24

标签: c

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

    }

3 个答案:

答案 0 :(得分: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中的正确位置。在我的示例(上图)中,我为id设置了4,为quantity设置了3等。在memcpy()调用之后,现在dataValuedata都会设置所有相同的值。它将data中的值与dataValue进行了对比。得到它?

答案 1 :(得分:0)

一些指示:

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

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

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

  • 您实际上并未将设置数据放入onode中,我怀疑您需要该行:

    linkedList-> data = dataValue;

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

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

然后你可以进行比较:

if (data->id == linkedList->data->id) {
    /* It matches */
}

答案 2 :(得分:-1)

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

顺便说一下,你有没有通过调试器运行它?