0

コードのごく一部で常にセグメンテーション エラーが発生しますが、その理由がわかりません。malloc を使用していて、データの一部に到達するとすぐにクラッシュする理由がわかりません。データは次のとおりです。

listNode* node = (listNode*)malloc(sizeof(listNode));    <-This is the Line
strcpy(node->entry, string); 
node->next = NULL;

構造体定義の使用:

typedef struct
{
    char* entry;
    struct listNode* next;
}listNode;

データはある時点で解放されますが、その時点に到達することはできません。助けてくれてありがとう!

4

3 に答える 3

2

malloc通話中にクラッシュしていますか? でクラッシュする可能性がはるかに高くなりますstrcpy。実際、この場合、正確には動作は未定義ですが、悪い動作を引き起こすことstrcpyがほぼ保証されています。

mallocヒープがいっぱいになっていない限り、これは成功するはずです。ただし、 を呼び出して を呼び出しmallocていないためcalloc、 の内容については保証されませんnode->entry。C標準は、で割り当てられたメモリに何が格納されるかを定義していないためmallocnode->entryゴミでいっぱいです。不正なポインタにコピーしようとすると、不正なメモリ アドレスにアクセスしようとしてアプリがクラッシュします。

Alexey Frunzeは fix- mallocspaceで 100% 正しく、新しく割り当てられたメモリnode->entry指すように変更し、. 別の SO answerで説明したように、これにより、初期化されていないポインターを使用するための未定義の動作が回避されます。stringnode->entry

于 2012-09-14T03:50:41.010 に答える
1

entryポインターにメモリを割り当てませんでした。string初期化されていないポインターによって指定された偽の場所にコピーしようとしていますentry。代わりにこれを行うことができます:

node->entry = malloc(strlen(string) + 1);
strcpy(node->entry, string);
于 2012-09-14T03:51:43.533 に答える
0

エントリ ポインタに割り当てメモリを割り当てていません。割り当て構造体が*エントリポインターに割り当てられた4バイトだけの場合と同様に、行う必要があります

listNode* node = (listNode*)malloc(sizeof(listNode)); // 構造体にメモリを割り当てます node->entry = malloc(strlen(string) + 1);// 文字列にメモリを割り当てます strcpy(node->entry, string); //文字列のコピー

今はうまくいきます

于 2012-09-14T04:45:52.773 に答える