2

リンクされたリストの概念を使用してプログラムを作成する必要があります。ubuntu、ideone.com で動作しますが、大学のテスターに​​提出すると、セグメンテーション違反/バス エラー/メモリ制限の超過/スタック制限の超過 (リストの 1 つ) が報告されます。

おそらく、DevCpp だけが落ちるため、問題はメモリの解放であり、free を使用するコードの一部が発生します。

ということで、Valgrindを使ってみたのですが、ログに何が書かれているのかよくわかりませんが、やはり「Invalid read of size 8」とか「Invalid write of size 8」と書いてあるのと、メモリ割り当て(sizeof blocksは8、しかし必ずしもそうではないと思います)。さらに、「エラーの概要: 48 個のコンテキストから 76 個のエラー (抑制: 2 個から 2 個)」および「総ヒープ使用量: 20 個の割り当て、20 個の解放、160 バイトの割り当て」(この行は重要だと思います) と書かれています。

最後に、問題がありそうなコードがあります。

TITEM *borrowItem(const char *to)
{ 
    TITEM *newItem = (TITEM *)malloc(sizeof(newItem));
    newItem->m_Next = NULL;
    newItem->m_To=(char *)malloc(sizeof(to));
    strcpy(newItem->m_To,to);
    newItem->m_Cargo = NULL;
    return newItem;
}

その問題はすでに割り当てにあると思います。この関数は、新しいリスト項目ポインタを作成するために使用されます。ここでメモリが解放されます。

void freeItem(TITEM *item)
{
    free(item->m_To);
    free(item);     
    return;    
}

m_To は文字列で、m_Next は次のアイテム ポインターです。

4

1 に答える 1

4

次のような文字列はコピーできません。

newItem->m_To=(char*)malloc(sizeof(to));
strcpy(newItem->m_To,to);

の値はsizeof(to)、ポインターが占有するバイト数 (4 または 8) になります。

次のいずれかを行う必要があります。

newItem->m_To = malloc(strlen(to) + 1);
strcpy(newItem->m_To,to);

strdupまたは、本質的に同じことを行うライブラリ関数を使用します。

newItem->m_To = strdup(to);

キャストも呼び出し(char*)から削除したことに注意してください。また、他の呼び出しmallocでキャストを削除する必要があります。mallocこれがストレートCなら、それは…


ディップスティックは言った: 正しいが不完全かもしれない. newItem の malloc もポインタのサイズを割り当てているだけではありませんか。

次のように構造を割り当てる必要があります。

TITEM *newItem = malloc(sizeof(TITEM));
于 2012-12-09T21:09:50.730 に答える