だから私は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」を何度も無視しますが、前の行は同じ)。
動的関数のポインター管理が悪いことに関係していると思いますが、なぜそれ自体が独自の「次の」ノードに設定されているのかわかりません。