Dev C++ 5.11中手动实现栈的C++程序无报错却终止执行
你的C++栈实现程序问题分析
栈指针未初始化
main函数里定义的stoiva指针没有初始化为NULL,属于野指针。第一次调用push时,新节点的next会指向这个野地址,导致链表结构混乱,后续操作极易触发未定义行为。修正方式是把定义改成:struct node *stoiva = NULL, *tmp;打印循环触发空指针访问
你用来打印栈的do-while循环逻辑有问题:do{ cout << tmp->data << endl; tmp = tmp->next; }while (tmp->next != NULL);当
tmp走到链表最后一个节点时,执行tmp = tmp->next后,tmp会变成NULL,此时循环条件判断tmp->next就是直接访问空指针的成员,这会直接导致程序崩溃终止。而且这个循环还会漏掉最后一个节点的打印。
正确的打印逻辑应该改成while循环:tmp = stoiva; while(tmp != NULL){ cout << tmp->data << endl; tmp = tmp->next; }冗余内存分配导致内存泄露
main开头的tmp = (struct node *)malloc(sizeof(struct node));完全没必要,后面你直接把tmp赋值为stoiva,导致这块分配的内存永远无法释放,属于内存泄露,直接删掉这句就行。额外优化点:pop函数的内存释放
你的pop函数只是移动了栈顶指针,但没有释放弹出节点的内存,长期运行会积累内存泄露。可以修改为:struct node *pop(struct node *root){ if(root == NULL) return NULL; // 空栈直接返回,避免出错 struct node *ptr = root; root = ptr->next; free(ptr); // 释放弹出的节点内存 return root; }
内容的提问来源于stack exchange,提问作者Nik D
相关产品推荐
相关产品推荐

