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:次の理由により、値を一度に1つずつ対処することを心配する必要はありませんmemcpy():

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

これにより、設定したすべてが取得されdata、それらの値が の正しい場所に配置されdataValueます。私の例 (上記) では、 に 4 、idに 3quantityなどを設定します。そのmemcpy()呼び出しの後、 と の両方dataValuedata同じ値がすべて設定されます。の値を にコピーしましdatadataValue。それを得る?

于 2013-03-11T17:23:08.387 に答える
0

いくつかの指針:

  • データがNULLの場合は無視するメモリの割り当てを避けるために、ルーチンの開始時にデータがNULLの場合に戻る必要があります。

  • memcpy の行は正しいですが、おそらく sizeof を変更する構文の方が明確なので、コピーされるメモリの量が明確になります。

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

  • 実際には設定データをオノデに入れません。次の行が必要だと思います。

    linkedList->data = dataValue;

コメントで尋ねると、新しい構造体の順序を記入することもできます。

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

そして、比較を行うことができます:

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

データをソースとして memcpy を呼び出していますが、次のステートメントでは、データが null でないことをテストします。これは、memcpy がクラッシュする場合にヌル データ ポインターが許容されることを示しています。おそらく、ここでステートメントの順序を並べ替える必要があります。

ところで、これをデバッガで実行しましたか?

于 2013-03-11T17:21:28.817 に答える