1

メモリから配列を返そうとしていcharますが、ランダムな値を取得しています。何が悪いのかわかりません。これは私のコードです:

スタック.h:

struct node{
    char s[MAX_STRING_SIZE];
    struct node * next;
};

typedef struct {
    struct node * head;
} stack;

stack.c:

char * pop(stack * my_stack){
    if (my_stack->head == NULL){
        printf("Stack is empty.");
        exit(0);
    } else {
        struct node * tmp = my_stack->head;
        char * s = tmp->s;

        my_stack->head = my_stack->head->next;

        free(tmp);

        return s;
    }
}

main.c:

char * s2 = pop(&my_stack);
printf("%s\n", s2);

これにより、ランダムな値がコンソールに出力されます。メモリからノードを正しく削除することを確認しました。この文字列を正しく返すにはどうすればよいですか?

4

1 に答える 1

9

この線

free(tmp);

返された文字列を含むメモリを解放します。(解放されると、メモリはいつでも再利用される可能性があります。場合によっては、プロセスから読み取れなくなることもあります。おそらく、ヒープ マネージャーがすぐに解放を設定するデバッグ ビルドを実行しているため、「ランダムな値」が表示されます。メモリを別の値に変更します。)

これを修正する方法はいくつかあります。

  • popreturnに変更し、呼び出し元をポップされたノードnode*に任せますfree
  • return voidfrom 、解放される前の内部popの値を出力spoptmp
  • 内にメモリを割り当て、これpopにコピーtmp->sしてから、この新しく割り当てられたブロックを返します(呼び出し元が解放する必要があります)。これはお勧めしません。メモリ不足で失敗するスタック ポッピング機能を持つことは非常に奇妙です...
于 2013-02-27T16:03:45.130 に答える