C语言用链表创建展示扑克牌卡组时打印失败、退出码异常问题求助
问题原因
- 链表尾插逻辑错误:
createCard函数中查找尾节点的循环条件写为while (p != NULL),循环结束时p已经是NULL指针,此时执行p->next = tmp属于空指针解引用,直接触发程序崩溃,这是返回异常退出码的核心原因。 - 打印函数参数非法访问:
- 打印循环条件写为
while (p->next != NULL)会遗漏最后一张卡牌的输出 suit是char类型,printf中错误使用%s格式符(%s要求传入字符串首地址),会触发非法内存访问- 未做空链表判断,若传入的head为NULL时直接访问
p->next会崩溃
- 打印循环条件写为
- 内存泄漏:仅释放了链表头节点,剩余51个卡牌节点未释放
- 随机数未播种:未调用
srand初始化随机数种子,每次运行生成的卡牌序列完全相同
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct card_s { char suit; int face; struct card_s* next; } card; card* createCard(int n); void printCard(card* head); void freeCard(card* head); int main(void) { // 初始化随机数种子 srand((unsigned int)time(NULL)); card* first = createCard(52); printCard(first); freeCard(first); return 0; } card * createCard(int n) { int i = 0; card* head = NULL; card* tmp = NULL; card* p = NULL; for (i = 0; i < n; i++) { tmp = (card*)malloc(sizeof(card)); // 生成1-10的点数 tmp->face = rand() % 10 + 1; // 随机取花色C/D/H/S tmp->suit = "CDHS"[rand() % 4]; tmp->next = NULL; if (head == NULL) { head = tmp; } else { p = head; // 修改循环条件,找到最后一个非空节点 while (p->next != NULL) { p = p->next; } p->next = tmp; } } return head; } void printCard(card * head) { // 空链表直接返回 if (head == NULL) { return; } card* p = head; // 修改循环条件,遍历所有节点 while (p != NULL) { // 修改格式符为%c输出char类型的花色 printf("%d%c\n", p->face, p->suit); p = p->next; } return; } // 新增释放链表所有节点的函数 void freeCard(card* head) { card* p = head; card* tmp = NULL; while (p != NULL) { tmp = p; p = p->next; free(tmp); } }
内容的提问来源于stack exchange,提问作者user34343434
相关产品推荐
相关产品推荐

