0

私はポインタとメモリモデルにかなり慣れていないので、これが明らかな場合はすみませんが、リストを逆にする関数reverseをテストするプログラムを書いています。とにかく、C5.c、C5-driver.c、C5.hの3つのファイルにあります。ここにそれらはその順序であります:

#include "C5.h"
#include <stdlib.h>
#include <stdio.h>

struct node *cons(int fst, struct node *rst) {
    struct node *new = malloc(sizeof(struct node));
    if (new == NULL) {
        printf("cons: out of memory\n");
        abort();
    }
    (*new).first = fst; /* same as (*new).first = fst */
    (*new).rest = rst;
    return new;
}

struct node *reverse(struct node *lst) {
    struct node *ans = NULL;
    while (lst != NULL) {
        ans = cons((*lst).first, ans);
        lst = (*lst).rest;
    }    
    return ans;
}

void free_list(struct node *lst) {
    struct node *p;
    while (lst != NULL) {
        p = lst->rest;
        free(lst);
        lst = p;
    }
}

void print_list(struct node *lst) {
    printf("( "); 
    while (lst != NULL) {
        printf("%d ", (*lst).first);
        lst = (*lst).rest;
    }
    printf(")\n");
}

C5-driver.c

#include <stdlib.h>
#include <stdio.h>
#include "C5.h"

int main() {
    struct node *lst1 = cons(5, NULL);
    struct node *lst2 = cons(3, lst1);
    struct node *lst3 = cons(1, lst2);
    print_list(lst3);
    lst3 = reverse(lst3);
    print_list(lst3);
    free_list(lst3);
}

C5.h

struct node { int first; struct node *rest; }; struct node *cons(int ,struct node *); struct node *reverse(struct node *); void print_list(struct node *); void free_list(struct node *);

ただし、XCodeから、メモリリークがあると言われています。

consが使用された後だと思いますが、newstruct node *ans = newとfree(new)を作成してみました。リターンans付き; しかし、それは機能しません。上記のように、free_listも試しました。

ありがとう〜

4

1 に答える 1

5

逆関数は、メモリを割り当てるconsを呼び出し、lst3ポインタを上書きします。メモリリークは、lst3が上書きされ、そのメモリを回復できなくなることです。

おそらくとのような新しい変数を作成する必要がstruct node *lst3_reverseありlst3_reverse = reverse(lst3)ます。その後、安全に実行してメモリを解放できfree_list(lst3)ますfree_list(lst3_reverse)

于 2013-01-16T20:43:36.370 に答える