C语言轮盘赌程序调用Mise()函数触发段错误(Core Dumped)求助
C语言轮盘赌程序段错误(Segmentation Fault)排查
问题概述
使用自定义图形库开发C语言轮盘赌程序,点击调用Mise()函数的按钮时触发segmentation error (core dumped)错误,调整循环参数后仍无法解决,需要定位问题根源。
相关代码片段
Mise()函数
int Mise(int ChoixChiffre[37], int ChoixCouleur, int ChoixDouzaine[3], int ChoixParite, int ChoixPlage, int MiseChiffre[37], int MiseCouleur, int MiseDouzaine[3], int MiseParite, int MisePlage, int ArgentJoueur, int resultatRoulette) { int gainTotal = 0; // Réinitialisation du gain total int Couleur = getCouleur(resultatRoulette); //Get the color of the number resultatRoulette for(int i = 1; i<37; i++) { if(ChoixChiffre[i] == resultatRoulette) { ArgentJoueur = ArgentJoueur + MiseChiffre[i] * 36; } } if(ChoixCouleur == Couleur) { ArgentJoueur = ArgentJoueur + MiseCouleur * 2; } for(int i = 1; i<3;i++) { if(ChoixDouzaine[i] == CheckDouzaine(resultatRoulette)) { ArgentJoueur = ArgentJoueur + MiseDouzaine[i] * 3; } } if((ChoixParite == 1 && resultatRoulette / 2 == 0) ||( ChoixParite == 0 && resultatRoulette !=0)) { ArgentJoueur = ArgentJoueur + MiseParite * 2; } if(ChoixPlage == CheckPlage(resultatRoulette)) { ArgentJoueur = ArgentJoueur + MisePlage * 2; } return ArgentJoueur; }
函数调用代码
if(abscisseSouris() >= 534 && abscisseSouris() <= 641 && ordonneeSouris() <= 583 && ordonneeSouris() >= 533) { int resultatRoulette = lancerRoulette(); ArgentJoueur = Mise(ChoixChiffre[37],ChoixCouleur, ChoixDouzaine[3], ChoixParite, ChoixPlage, MiseChiffre[37], MiseCouleur, MiseDouzaine[3], MiseParite, MisePlage, ArgentJoueur, resultatRoulette); ChoixCouleur = 0; ChoixParite = 0; ChoixPlage = 0; MiseCouleur = 0; MiseParite =0; MisePlage = 0; printf("Test"); for(int i = 1; i<37;i++) { MiseChiffre[i] = 0; ChoixChiffre[i] = 0; } for(int i = 1; i<3;i++) { MiseDouzaine[i] = 0; ChoixDouzaine[i] = 0; } MiseDouzaine[3] = 0; ChoixDouzaine[3] = 0; cercle(blancx[resultatRoulette], blancy[resultatRoulette], 20); }
getCouleur()函数
int getCouleur(int nombre) //0 si Vert, 1 si Rouge, 2 si Noir { int noir[] = {2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35}; for (int i = 1; i < 18; i++) { if (nombre == noir[i]) { return 2; } if (nombre == 0) { return 0; } } return 1; }
错误根源分析与修复方案
1. 函数调用时数组参数传递错误(核心段错误原因)
Mise()函数声明中,ChoixChiffre[37]、ChoixDouzaine[3]等参数实际接收的是数组指针,但调用时传入的是ChoixChiffre[37]——这是访问数组的第38个元素(C语言数组索引从0开始,ChoixChiffre长度为37,有效索引是0-36),属于数组越界访问,直接触发段错误。
修复方式:调用Mise()时直接传递数组名(数组名会隐式转换为指向首元素的指针),修正后的调用代码:
ArgentJoueur = Mise(ChoixChiffre, ChoixCouleur, ChoixDouzaine, ChoixParite, ChoixPlage, MiseChiffre, MiseCouleur, MiseDouzaine, MiseParite, MisePlage, ArgentJoueur, resultatRoulette);
2. getCouleur()函数的逻辑错误
- 循环从
i=1开始,会漏掉noir[0](数字2),导致数字2无法被识别为黑色; if(nombre == 0)的判断放在循环内部,只有当循环执行到i>=1时才会检查,逻辑冗余且可能延迟判断。
修复后的getCouleur():
int getCouleur(int nombre) //0 si Vert, 1 si Rouge, 2 si Noir { if (nombre == 0) { return 0; // 0是绿色 } int noir[] = {2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35}; for (int i = 0; i < 18; i++) { // 从0开始遍历所有黑色数字 if (nombre == noir[i]) { return 2; } } return 1; // 既不是0也不是黑色,就是红色 }
3. Mise()函数中的奇偶判断逻辑错误
原代码用resultatRoulette / 2 == 0判断偶数是错误的(整数除法中,比如4/2=2≠0),且ChoixParite == 0 && resultatRoulette !=0的逻辑完全错误,无法正确判断奇数下注。
修复后的奇偶判断代码(假设ChoixParite=1代表下注偶数,ChoixParite=0代表下注奇数):
if((ChoixParite == 1 && resultatRoulette !=0 && resultatRoulette % 2 == 0) || (ChoixParite == 0 && resultatRoulette !=0 && resultatRoulette % 2 != 0)) { ArgentJoueur = ArgentJoueur + MiseParite * 2; }
4. 数组越界访问隐患
ChoixDouzaine长度为3,有效索引是0-2,但调用代码中出现MiseDouzaine[3] = 0;和ChoixDouzaine[3] = 0;,属于越界访问,可能破坏内存。
修复方式:将这两行改为遍历索引0-2清零,合并到上方的循环中:
for(int i = 0; i<3;i++) { // 从0开始遍历3个元素 MiseDouzaine[i] = 0; ChoixDouzaine[i] = 0; }
内容的提问来源于stack exchange,提问作者furie_noire
相关产品推荐
相关产品推荐

