-2

私のプログラムは、次の断片的なコードでクラッシュします:

  newElement->name = (char*) malloc((strlen(name) + 1) * sizeof(char));

デバッガーを使用すると SIGABRT エラーが発生しますが、2 回目の反復中に停止するため理由がわかりません (最初の反復は問題なく実行されます)。

かどうかを確認しました

  name

途方もないヌル文字があり、それがあります。

コード全体は次のとおりです。

element* createElement(const char* name, const char* text) {
if (name == NULL) return NULL;                             

element* newElement = malloc(sizeof(element));
    if (newElement == NULL) return NULL;                    

    newElement->name = (char*) malloc((strlen(name) + 1) * sizeof(char));
    if (newElement->name == NULL) return NULL;
    strcpy(newElement->name, name);

if (text == NULL) newElement->text = NULL;
else
{
    newElement->text = malloc((strlen(text) + 1) * sizeof(char));
        if (newElement->text == NULL) return NULL;
    strcpy(newElement->text, text);
}

newElement->parentNode = NULL;
newElement->previousSibling = NULL;
newElement->nextSibling = NULL;
newElement->firstChild = NULL;
newElement->lastChild = NULL;

return newElement;

}

4

3 に答える 3

0

から

http://linux.die.net/man/3/malloc

MALLOC_CHECK_ が 0 に設定されている場合、検出されたヒープの破損は黙って無視されます。1 に設定すると、診断メッセージが stderr に出力されます。2 に設定すると、abort(3) がすぐに呼び出されます。3 に設定すると、診断メッセージが stderr に出力され、プログラムが中止されます。

MALLOC_CHECK_ が 2 または 3 に設定されているため、SIGABRT が発生します。2 の場合は、診断メッセージを取得するために 3 に変更します。

于 2013-04-15T00:17:05.597 に答える
0

あなたのコード自体はまったく問題ありません。

sigabort、ヒープ オーバーフローが原因である可能性があります。つまり、malloc.

于 2013-04-14T23:38:12.680 に答える
0

次の式で指定されたメモリの特定の部分を malloc しようとしています。

(strlen(name) + 1) * sizeof(char)

おそらく問題は strlen(name) 部分にあります。name にヌルで終了する文字列がないため、 strlen が機能しない可能性があります。

コメントで指摘されているように、malloc 自体は作成およびヒープ オーバーフローを想定していませんが、ヒープ オーバーフロー、バッファ オーバーフロー、またはリークが原因である可能性がある内部データの破損が検出された場合、abort() を実際に呼び出す可能性があります。このコードに直接関連しないコードの他の部分。ここで重要なことは、この malloc 呼び出しが返されるかどうかです。または実行中にシグナルを送信しますか?

返されず、実行中に SIGABRT が送信される場合、プログラムのどこで malloc に必要なデータ構造が破損しているのかを突き止めるのに苦労する可能性があります...最初の malloc 呼び出しが実行されると言っている場合問題はないかもしれませんが、その間にどのコードが実行されているかを確認する必要がありますが、2 つの malloc 呼び出しの間に破損が発生していることを確認できないと思います。理由...

于 2013-04-14T23:39:10.970 に答える