1

だから私はCにはかなり慣れていませんが、プログラミングには不慣れです。私は C を学ぼうとしているので、単純な連結リストを実装してみることにしました。

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

#include <stdio.h>

typedef struct node node;
struct node {
    char *word;
    node *next;
};

// Returns a node.
node node_new(char *word) {
    node n;
    n.word = word;
    n.next = NULL;
    return n;
}

// Traverses the linked list, spitting out the
// words onto the console.
void traverse(node *head) {
    node *cur = head;

    while (cur != NULL) {
        printf("I have %s.\n", cur->word);
        cur = cur->next;
    }

    printf("Done.\n");

    return;
}

// In here I get circular references whenever I pass a second argument.
void dynamic(int argc, char **argv) {
    printf("DYNAMIC:\n");

    node n = node_new("ROOT");
    node *cur = &n;

    int i;
    for (i = 0; i < argc; i++) {
        node next = node_new(argv[i]);
        cur->next = &next;
        cur = &next;
    }

    traverse(&n);
}

void predefined(void) {
    printf("PREDEFINED:\n");

    node n = node_new("ROOT");
    node a = node_new("A");
    node b = node_new("B");
    node c = node_new("C");

    n.next = &a;
    a.next = &b;
    b.next = &c;

    traverse(&n);
}

int main(int argc, char **argv) {
    predefined();
    dynamic(argc, argv);
    return 0;
}

引数 ("./test") なしで実行すると、出力は次のようになります。

PREDEFINED:
I have ROOT.
I have A.
I have B.
I have C.
Done.
DYNAMIC:
I have ROOT.
I have ./test.
Done.

しかし、「I have ./test.」の代わりに引数を付ける場合。コマンドラインの最後の引数が何であれ、無限ループになります(「./test one two three」は「i have three.」を返します。「one」と「two」を何度も無視しますが、前の行は同じ)。

動的関数のポインター管理が悪いことに関係していると思いますが、なぜそれ自体が独自の「次の」ノードに設定されているのかわかりません。

4

2 に答える 2

2

問題はあなたのforループにあります。すべての反復で、スタック上の同じメモリ位置を使用してnext変数を格納します。したがって、事実上、 によって与えられるメモリ位置&nextはループ全体の定数でforあり、 を実行するtraverseまでに、そのメモリ位置には の最後の値が含まれますnext

あなたのforループはこのバージョンと同等であり、より多くの光を当てる可能性があります:

int i;
node next;  // note this line
for (i = 0; i < argc; i++) {
    next = node_new(argv[i]);
    cur->next = &next;
    cur = &next;
}

アドレスを渡したり、アドレスを他のデータ構造に保存できるようにしたい場合は、ヒープ上に新しいノードを作成する必要があります。とを読んでmallocくださいfree

于 2013-06-25T17:31:22.150 に答える