懂哥速来,哪里错了,怎么修改。内存访问错误

0x00007FF6B14E7771 处(位于 基数排序.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000016D476908F0 时发生访问冲突。

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

#include<iostream>
#include<cmath>
#include<ctime>

using namespace std;

#define NUMMAX 10000
#define BUCKETMAX 10

typedef int Type;


void text(Type arrNum[],int arrNumMax)
{
    for (int i = 0; i < arrNumMax;i++)
    {
        int num = rand() % 1000;
        arrNum[i] = num;
    }
}

void showArray(Type arrNum[], int arrNumMax)
{
    for (int i = 0; i < arrNumMax; i++)
    {
        cout << arrNum[i] << "\t";
    }
}


void newBucket(Type* arrBucketAddr[], int arrBucketAddrMax, int arrNumMax)
{
    int i = 0;
    for (i = 0; i < arrBucketAddrMax; i++)
    {
        arrBucketAddr[i] = new Type[arrNumMax];
    }
}

void sortNumToBucket(Type arrNum[], int arrNumMax, Type* arrBucketAddr[], int arrBucketAddrMax, int Bucketflag[], int nowDigits, int way)
{
    int i = 0,j=0;

    if (way == 1)
    {
        for (i = 0; i < arrNumMax; i++)
        {
            for (j = 0; j < arrBucketAddrMax; j++)
            {
                if (arrNum[i] / (int)pow(arrBucketAddrMax,nowDigits) % arrBucketAddrMax == j)
                {
                    *(arrBucketAddr[j]+Bucketflag[j]) = arrNum[i];
                    Bucketflag[j]++;
                    break;
                }
            }
        }
    }
    else if (way == 2)
    {
        for (i = 0; i < arrNumMax; i++)
        {
            for (j = 0; j < arrBucketAddrMax; j++)
            {
                if (arrNum[i] / (int)pow(arrBucketAddrMax, nowDigits) % arrBucketAddrMax == j)
                {
                    *(arrBucketAddr[arrBucketAddrMax-1-j] + Bucketflag[arrBucketAddrMax - 1 - j]) = arrNum[i];
                    Bucketflag[arrBucketAddrMax - 1 - j]++;
                    break;
                }
            }
        }
    }
}

void sortBucketToNum(Type arrNum[], int arrNumMax, Type* arrBucketAddr[], int arrBucketAddrMax, int Bucketflag[])
{
    int i = 0, j = 0, k = 0;
    for (i = 0; i < arrNumMax;)
    {
        for (j = 0; j < arrBucketAddrMax; j++)
        {
            for (k = 0; k < Bucketflag[j]; k++)
            {
                arrNum[i] = *(arrBucketAddr[j] + k);
                i++;
            }
            Bucketflag[j] = 0;
        }
    }
}

Type findMax(Type arrNum[], int arrNumMax)
{
    int i = 0;
    Type max = arrNum[0];
    for (i = 0; i < arrNumMax; i++)
    {
        if (arrNum[i] > max)
        {
            max = arrNum[i];
        }
    }
    return max;
}

int calcDigits(Type num)
{
    int i=0;
    if (num == 0)
    {
        return 1;
    }
    
    for (i = 0; num != 0; num /= 10, i++);
    return i;
    
}

void bucketSort(Type arrNum[], int arrNumMax, int way)
{
    Type** arrBucketAddr=new Type* [BUCKETMAX];
    int Bucketflag[] = { 0 };

    newBucket(arrBucketAddr, BUCKETMAX, arrNumMax);
    Type max = findMax(arrNum, arrNumMax);
    int maxDigits = calcDigits(max);
    for (int nowDigits = 0; nowDigits < maxDigits; nowDigits++)
    {
        sortNumToBucket(arrNum,arrNumMax,arrBucketAddr,BUCKETMAX,Bucketflag,nowDigits,way);
        sortBucketToNum(arrNum, arrNumMax, arrBucketAddr, BUCKETMAX, Bucketflag);
    }
   
    delete[] arrBucketAddr;
}

int main()
{
    srand((unsigned int)time(NULL));
    Type* arrNum = new Type[NUMMAX];
    text(arrNum, NUMMAX);

    bucketSort(arrNum, NUMMAX, 2);

    showArray(arrNum, NUMMAX);

    delete[] arrNum;
    return EXIT_SUCCESS;
}

img

为什么会出现以上问题,怎样修改才能解决

这里错了 int Bucketflag[] = { 0 }; 改成 Bucketflag[10], 少了一个10

void bucketSort(Type arrNum[], int arrNumMax, int way)
{
    Type** arrBucketAddr=new Type* [BUCKETMAX];
    int Bucketflag[10] = { 0 }; /*++++++++加上一个10 +++++++*/

    newBucket(arrBucketAddr, BUCKETMAX, arrNumMax);
    Type max = findMax(arrNum, arrNumMax);
    int maxDigits = calcDigits(max);
    for (int nowDigits = 0; nowDigits < maxDigits; nowDigits++)
    {
        sortNumToBucket(arrNum,arrNumMax,arrBucketAddr,BUCKETMAX,Bucketflag,nowDigits,way);
        sortBucketToNum(arrNum, arrNumMax, arrBucketAddr, BUCKETMAX, Bucketflag);
    }
   
    delete[] arrBucketAddr;
}

你在这个地方加上打印把该打的变量都打印出来 肯定是越界了 然后根据打印去找问题分析arrBucketAddrMax和j的值肯定要打印出来看 去看下是否超数组长度了

1,67行代码处打断点
2,Debug模式启动程序进行调试
3,观察Crash前一刻的指针变量,数组变量的值,要么访问无效指针,要么数组越界

在第123行代码这里,Bucketflag[],中括号里面加上BUCKETMAX就OK了

注意越界

*(arrBucketAddr[arrBucketAddrMax-1-j] + Bucketflag[arrBucketAddrMax - 1 - j]) = arrNum[i];
这不是不应该给左值赋值吗