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

C++扑克牌打印程序编译通过但运行时崩溃问题求助

问题原因

你的程序崩溃全部是数组越界访问和逻辑赋值错误导致的,具体问题如下:

  • C++中长度为n的数组合法下标范围是0 ~ n-1,你所有循环都使用了<=作为边界判断,直接访问了数组外的内存空间,触发内存访问错误导致崩溃
  • DevC++默认未开启数组越界编译检查,所以编译阶段没有报错,运行时访问非法内存直接触发崩溃
  • 花色赋值逻辑错误,你用点数索引j去取花色数组type的值,远超出花色数组的4个元素范围
  • 三个具体的越界点:
    1. printdeck函数中循环写了f<=52,deck数组只有52个元素,合法最大下标是51
    2. main函数外层循环写了i<=4,花色数组type只有4个元素,合法最大下标是3
    3. main函数内层循环写了j<=13,点数数组num只有13个元素,合法最大下标是12
修正后完整代码
#include <iostream>
#include <string>
using namespace std;


struct card
{
    int num;
    string type;
    
    void printcard()
    {
        cout<<num<<" "<<type<<endl; // 新增换行提升可读性
    }
};

card deck[52];

void printdeck()
{
    // 修正循环边界为<52
    for (int f=0; f<52; f++)
    {
        deck[f].printcard();
    }
}

int main()
{
    int J=10,Q=10,K=10,A=11;
    int num[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A};
    string type[] ={"Jvari", "Yvavi", "Guli", "Aguri"};
    
    int k=0;
    // 修正外层循环边界为<4,对应4种花色
    for(int i=0; i<4; i++)
    {
        // 修正内层循环边界为<13,对应13种点数
        for(int j=0; j<13; j++)
        {
            deck[k].num = num[j];
            // 修正花色取值索引为外层循环的i
            deck[k].type = type[i];
            k++;
        }
    }
    
    printdeck();
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Programvarg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:36:08