C++扑克牌打印程序编译通过但运行时崩溃问题求助
问题原因
你的程序崩溃全部是数组越界访问和逻辑赋值错误导致的,具体问题如下:
- C++中长度为n的数组合法下标范围是
0 ~ n-1,你所有循环都使用了<=作为边界判断,直接访问了数组外的内存空间,触发内存访问错误导致崩溃 - DevC++默认未开启数组越界编译检查,所以编译阶段没有报错,运行时访问非法内存直接触发崩溃
- 花色赋值逻辑错误,你用点数索引
j去取花色数组type的值,远超出花色数组的4个元素范围 - 三个具体的越界点:
printdeck函数中循环写了f<=52,deck数组只有52个元素,合法最大下标是51- main函数外层循环写了
i<=4,花色数组type只有4个元素,合法最大下标是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
相关产品推荐
相关产品推荐

