[英]Infinite Loop when using 'for' with pointer as loop variable
我对编码很陌生,遇到了问题。 我尝试自己解决该问题,并进行了很多次谷歌搜索,但是我仍然没有解决方案。 也许你们其中之一可以帮助您?
这是我的代码:
int main(int argc, char **argv) {
struct node {
char *str;
int count;
struct node *next;
};
struct node head = { argv[1], 1, NULL };
for (int i = 2; i < (argc); i++) {
for (struct node *p = &head; (p != NULL); p = p->next) {
printf("%s,%s\n", argv[i], p->str);
if (strcmp(argv[i], p->str) == 0) {
printf("case1\n");
p->count++;
break;
}
else if ((strcmp(argv[i], p->str) != 0) && p->next) {
printf("case2\n");
printf("Adresse, auf die p zeigt: %p", &p);
continue;
}
else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
printf("case3\n");
struct node *oldhead = &head;
head.str = argv[i];
head.count = 1;
head.next = oldhead;
break;
}
}
}
// Print how many times each string appears
return 0;
}
目的是创建一个链接列表,其中包含我在调用程序时提供给main()
所有参数。 如果有重复项,则结构应将其计数。 例如,如果我像./a.out foo fool foo
这样调用程序,则结果应为长度为2的列表,其中第一个元素包含字符串"foo"
,计数为2
,第二个元素包含字符串"fool"
并且计数为1
。 问题是内部for循环中的else if
-statement。 这是其中内for循环应该实际使用,并为其分配的唯一部分p->next
至p
。 不幸的是,这没有发生。 结果是内部的for循环一遍又一遍地开始,并且指针p一直一直指向相同的地址(我用printf找出了)。
你们中的任何一个有一个想法,这可能是什么问题吗? 我尽了一切努力,并尝试在网上找到解决方案...
非常感谢!!!
问题出在代码的这一部分
else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
printf("case3\n");
struct node *oldhead = &head;
head.str = argv[i];
head.count = 1;
head.next = oldhead;
break;
}
您需要分配一个新的结构,然后将其地址放在最后一个结构条目中。
else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
printf("case3\n");
struct node *oldhead = p;
p = (struct node *) malloc(sizeof(node));
if (p == NULL) { .... manage the error ... }
oldhead->next = p;
p->str = argv[i];
p->count = 1;
p->next = NULL;
break;
}
现在,您正在创建节点并将它们串在一起。 您之前实际上是在更新同一node
。
struct node *oldhead = &head;
head.str = argv[i];
head.count = 1;
head.next = oldhead;
那不是在创建一个新节点。 它只是创建对同一节点的新引用,因此当您尝试读取链接列表直到最后时会导致无限循环。 因此,您的程序只有一个节点。 您实际上需要分配并创建新的。
这里的主要问题是
struct node *oldhead = &head;
你应该做malloc
:
struct node *oldhead = (struct node*) malloc(sizeof(struct node));
因此您实际上为新节点分配了一块内存。 并且由于您具有malloc
,因此您也应该在程序结束时进行free
:
while(...) {
free(deepest_node)
}
进行上述循环的方法是从链接列表中最远的节点一直返回到head
。
另一个问题是,您不应将新节点附加到head
:
head.next = oldhead;
但应该是p
,它是链接列表中的最后一个节点:
p -> next = oldhead;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.