cloud___fly 2022-12-01 09:34 采纳率: 100%
浏览 111
已结题

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

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

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

6条回答 默认 最新

  • X-道至简 2022-12-02 11:11
    关注

    这里错了 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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 12月10日
  • 已采纳回答 12月2日
  • 赞助了问题酬金15元 12月1日
  • 修改了问题 12月1日
  • 展开全部

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集