我更改了代码,将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;
}
答案 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()
调用之后,现在dataValue
和data
都会设置所有相同的值。它将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会崩溃。您可能需要重新排列语句的顺序。
顺便说一下,你有没有通过调试器运行它?