c++ 0xC0000005: 读取位置 0xCDFCC6E4 时发生访问冲突。

问题遇到的现象和发生背景

在写人工洗牌发牌到最后没有bug提示了,但输出的时候说发生访问冲突。事实上,其实还有一个黄色警告说f没有初始化,但是我改了int f[13]={0};也没用,就又改回来了。

问题相关代码,请勿粘贴截图

struct card //定义结构card代表玩家拿到的卡牌
{

char huase[10];
int num;

};

void paimon(int n, card *m)
{

int a[52];//定义1~52随机排列的数组a[52]
int temp;
for (int i = 0; i < 52; i++) //给a[52]赋值
{
    a[i] = i + 1;
}
srand((int)time(NULL));//使用srand,rand函数将赋给a[52]的值打乱
for (int j = 0; j < 52; j++)
{
    temp = rand() % 52;
    int t = a[j];
    a[j] = a[temp];
    a[temp] = t;
}

for (int k = 0; k < 52; k++)
{
    if (a[n] <= 13)
    {
        *m = card{ "梅花",a[n] };
    }
    else if (a[n] > 13 && a[n] <= 26)
    {
        *m = card{ "方块",a[n] - 13 };
    }
    else if (a[n] > 26 && a[n] <= 39)
    {
        *m = card{ "红心",a[n] - 26 };
    }
    else
    {
        *m = card{ "黑桃",a[n] - 39 };
    }
}

}

void fun(card b[13],int g[13])//给玩家拿到手里的牌按照花色、大小进行排序
{

int f[13];
for (int d = 0; d < 13; d++)
{
    if (b[d].huase == "梅花")
        f[d] = b[d].num;
    else if (b[d].huase == "方块")
        f[d] = b[d].num + 13;
    else if (b[d].huase == "红心")
        f[d] = b[d].num + 26;
    else if (b[d].huase == "黑桃")
        f[d] = b[d].num + 39;
}

for (int h = 0; h < 13; h++)
{
    g[h] = h;
}

int tep = 0;
for (int l = 0; l < 13; l++)
{
    for (int m = l; m < 13; m++)
    {
        if (f[l] > f[m])
        {
            tep = f[l];
            f[l] = f[m];
            f[m] = tep;
            tep = g[l];
            g[l] = g[m];
            g[m] = tep;
        }
    }
}

}

char simon(int klee)
{

if (klee == 0)
    return 'A';
else if (klee == 1)
    return 'K';
else if (klee == 2)
    return 'Q';
else if (klee == 3)
    return 'J';
else
    return klee - '0' + 4;

}

int main()
{

card p1[13] = { 0,0 }, p2[13] = { 0,0 }, p3[13] = { 0,0 }, p4[13] = {0,0};//初始化玩家
cout << "玩家1" << "\t" << "玩家2" << "\t" << "玩家3"  << "\t" << "玩家4" << endl;

for (int n = 0; n < 13; n++)//发牌
{
    paimon(4 * n, &p1[n]);
    paimon(4 * n + 1, &p2[n]);
    paimon(4 * n + 2, &p3[n]);
    paimon(4 * n + 3, &p4[n]);
}

int g[13], h[13], j[13], k[13];
fun(&p1[13], &g[13]);
fun(&p2[13], &h[13]);
fun(&p3[13], &j[13]);
fun(&p4[13], &k[13]);

for (int l = 0; l < 13; l++)//输出
{

    cout << p1[g[l]].huase << " " << simon(p1[g[l]].num) << "\t"
         << p2[h[l]].huase << " " << simon(p2[h[l]].num) << "\t"
         << p3[j[l]].huase << " " << simon(p3[j[l]].num) << "\t"
         << p4[k[l]].huase << " " << simon(p4[k[l]].num) << endl;
}

return 0;

}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

为什么错了,怎么该才能正常运行啊。


#include<iostream>
using namespace std;
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<string>



typedef struct card //定义结构card代表玩家拿到的卡牌
{
    char huase[10];
    int num;
}Card;

void paimon(int n, Card *m)
{
    int a[52];//定义1~52随机排列的数组a[52]
    int temp;
    for (int i = 0; i < 52; i++) //给a[52]赋值
    {
        a[i] = i + 1;
    }
    srand((int)time(NULL));//使用srand,rand函数将赋给a[52]的值打乱
    for (int j = 0; j < 52; j++)
    {
        temp = rand() % 52;
        int t = a[j];
        a[j] = a[temp];
        a[temp] = t;
    }

    for (int k = 0; k < 52; k++)
    {
        if (a[n] <= 13)
        {
            *m = Card{ "梅花",a[n] };
        }
        else if (a[n] > 13 && a[n] <= 26)
        {
            *m = Card{ "方块",a[n] - 13 };
        }
        else if (a[n] > 26 && a[n] <= 39)
        {
            *m = Card{ "红心",a[n] - 26 };
        }
        else
        {
            *m = Card{ "黑桃",a[n] - 39 };
        }
    }
}

void fun(Card b[13], int g[13])//给玩家拿到手里的牌按照花色、大小进行排序
{
    int f[13];
    for (int d = 0; d < 13; d++)
    {
        if (b[d].huase == "梅花")
            f[d] = b[d].num;
        else if (b[d].huase == "方块")
            f[d] = b[d].num + 13;
        else if (b[d].huase == "红心")
            f[d] = b[d].num + 26;
        else if (b[d].huase == "黑桃")
            f[d] = b[d].num + 39;
    }

    for (int h = 0; h < 13; h++)
    {
        g[h] = h;
    }

    int tep = 0;
    for (int l = 0; l < 13; l++)
    {
        for (int m = l; m < 13; m++)
        {
            if (f[l] > f[m])
            {
                tep = f[l];
                f[l] = f[m];
                f[m] = tep;
                tep = g[l];
                g[l] = g[m];
                g[m] = tep;
            }
        }
    }
}

char simon(int klee)
{
    if (klee == 0)
        return 'A';
    else if (klee == 1)
        return 'K';
    else if (klee == 2)
        return 'Q';
    else if (klee == 3)
        return 'J';
    else
        return klee - '0' + 4;
}

int main()
{
    Card p1[13] = { 0}, p2[13] = { 0 }, p3[13] = { 0 }, p4[13] = { 0 };//初始化玩家
    cout << "玩家1" << "\t" << "玩家2" << "\t" << "玩家3" << "\t" << "玩家4" << endl;

    for (int n = 0; n < 13; n++)//发牌
    {
        paimon(4 * n, &p1[n]);
        paimon(4 * n + 1, &p2[n]);
        paimon(4 * n + 2, &p3[n]);
        paimon(4 * n + 3, &p4[n]);
    }

    int g[13], h[13], j[13], k[13];
    fun(p1, g);
    fun(p2, h);
    fun(p3, j);
    fun(p4, k);

    for (int l = 0; l < 13; l++)//输出
    {

        cout << p1[g[l]].huase << " " << simon(p1[g[l]].num) << "\t"
            << p2[h[l]].huase << " " << simon(p2[h[l]].num) << "\t"
            << p3[j[l]].huase << " " << simon(p3[j[l]].num) << "\t"
            << p4[k[l]].huase << " " << simon(p4[k[l]].num) << endl;
    }

    return 0;
}


g数组最后两个元素似乎没有正确赋值。代码不全,无法细看

目前看到两个问题,第一个就是main函数fun传数组 不可以加[13] 你定义13了 你这样传是传数组后面的 已经溢出了,直接传数组名就是传数组了;第二个是
return '10' - klee + 4; 你这个竟然不会报错?''表示一个字符 " "才表示字符串,10是2个字符 就是字符串了,知道你是要用ascill码求,但klee-'0'+4才对

访问位置冲突是不是这里的问题,

    for (int l = 0; l < 13; l++)
    {
        for (int m = l; m < 13; m++)
        {
            if (f[l] > f[m])
            {
                tep = f[l];
                f[l] = f[m];
                f[m] = tep;
                tep = g[l];
                g[l] = g[m];
                g[m] = tep;
            }
        }
    }

这段排序代码改成下面那样试试

for (int l = 0; l < 13; l++)
    {
        for (int m = 0; m < 13-l-1; m++)
        {
            if (f[m] > f[m+1])
            {
                tep = f[m];

                f[m] = f[m+1];

                f[m+1] = tep;

                tep = g[m];

                g[m] = g[m+1];

                g[m+1] = tep;
            }
        }
    }

fun(&p1[13], &g[13]);
fun(&p2[13], &h[13]);
fun(&p3[13], &j[13]);
fun(&p4[13], &k[13]);
改成
fun(p1[13], g[13]);
fun(p2[13], h[13]);
fun(p3[13], j[13]);
fun(p4[13], k[13]);