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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:55