You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表超市程序循环异常: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:45:36