双向链表超市程序循环异常:3次输入后崩溃返回3221226356
问题排查与修复方案
核心崩溃原因:内存分配错误
createNode函数里的内存分配逻辑完全错误——用sizeof(Node*)只会分配指针大小的内存(通常4/8字节),但struct Node包含字符数组和两个指针,实际需要的内存远大于这个值。内存分配不足会导致后续写入节点数据时越界,破坏堆结构,几次操作后直接触发堆损坏错误(错误码3221226356)。
修复代码:
Node* createNode(int value, char name[]){ // 分配结构体实际大小的内存,用sizeof(*newNode)更安全,避免写错类型名 Node* newNode = (Node*)malloc(sizeof(*newNode)); if(newNode == NULL){ printf("内存分配失败!\n"); exit(EXIT_FAILURE); } strcpy(newNode->Name, name); newNode->value = value; // 必须初始化next和prev指针,避免野指针 newNode->next = NULL; newNode->prev = NULL; return newNode; }
次要问题:字符串缓冲区溢出
itemcode定义为char itemcode[2],但输入的商品编码(如"A0")需要2个字符加1个字符串结束符\0,至少要3字节空间,否则strcpy时会越界:char itemcode[3];optionstring用scanf("%c")会读取上次输入残留的换行符,导致循环判断异常,直接改成单个字符变量更简单:// 替换原optionstring数组为单个字符 char option; // ... printf("Do you want to continue? [Y | N]? : "); // 加空格跳过前面的空白字符(包括换行) scanf(" %c", &option); getchar(); // 循环条件简化 }while(option == 'Y' || option == 'y');
其他逻辑错误修正
商品编码的校验逻辑写反了,原代码只有当编码既不是'A'开头、同时数字也不是0-4时才循环,正确逻辑应该是:只要不是'A'开头,或者数字不在0-4范围内,就重新输入:
do{ printf("Insert the item code you want to buy : "); scanf("%s", itemcode); getchar(); }while(itemcode[0] != 'A' || (itemcode[1] < '0' || itemcode[1] > '4'));
验证效果
修复上述问题后,程序可以稳定支持10次以上的商品输入,不会再出现崩溃。
内容的提问来源于stack exchange,提问作者Ignatius Kennard
相关产品推荐
相关产品推荐

