微茸鱼鱼 2024-08-19 17:02 采纳率: 100%
浏览 7
已结题

C++出现读取位置访问冲突

求问:我的C++代码想要解决的问题是:

设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。
通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。
五名英雄信息如下:
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"}

我的代码是:


```c++
#include<iostream>
#include<string>
#pragma pack(1)
using namespace std;
struct hero
{
    string name;
    int age;
    string sex;
};
void bubble(struct hero arr[], int len)
{
    for (int i = 0; i < len; i++)
    {
        hero temp;
        for (int j = 0; j < 5-i; j++)
        {
            if (arr[j].age > arr[j + 1].age)
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}
void priall(struct hero arr[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << "姓名:  " << arr[i].name << "年龄:  " << arr[i].age << "性别:" << arr[i].sex << endl;
    }
}
int main()
{
    struct hero arr[5] =
    {
          {"刘备",23,"男"},
        {"关羽",22,"男"},
        {"张飞",20,"男"},
        {"赵云",21,"男"},
        {"貂蝉",19,"女"}
    };
    int len = sizeof(arr);
    bubble(arr, len);
    priall(arr, len);
        return 0;
}

代码运行起来在void bubble中的

> 
```c++
temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;

处会出现报错:0x7B8538DE (vcruntime140d.dll)处(位于 2024.8.15C++.exe 中)引发的异常: 0xC0000005: 读取位置 0x9D63ADDB 时发生访问冲突。

img

请问如何解决呢?我自己也在CSDN上搜索过类似的报错,但是不会解决

  • 写回答

2条回答 默认 最新

  • 一直免费一直爽 2024-08-19 17:03
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    问题出在bubble函数中的冒泡排序算法实现上,当j等于len-1时,arr[j+1]会导致访问越界。为了解决这个问题,你需要将内层循环的条件从j<5-i改为j<len-1-i,这样就不会发生数组越界的问题了。修改后的代码如下:

    void bubble(struct hero arr[], int len)
    {
        for (int i = 0; i < len; i++)
        {
            hero temp;
            for (int j = 0; j < len - 1 - i; j++)
            {
                if (arr[j].age > arr[j + 1].age)
                {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
    

    另外,计算数组长度的方法也需要修改。你应该使用sizeof(arr) / sizeof(arr[0])来计算数组的长度,而不是直接使用sizeof(arr)。修改后的代码如下:

    int main()
    {
        struct hero arr[5] =
        {
            {"刘备",23,"男"},
            {"关羽",22,"男"},
            {"张飞",20,"男"},
            {"赵云",21,"男"},
            {"貂蝉",19,"女"}
        };
        int len = sizeof(arr) / sizeof(arr[0]);
        bubble(arr, len);
        priall(arr, len);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月28日
  • 已采纳回答 8月20日
  • 创建了问题 8月19日

悬赏问题

  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?
  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题