鱼C论坛

 找回密码
 立即注册
查看: 805|回复: 11

[已解决]为什么缓冲区数据溢出了啊

[复制链接]
发表于 2024-3-5 21:49:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Worker **newSpace = new Worker*[newSize];
上面的缓冲区数据溢出了, Worker是一个类,newSize是想要子类的数量
一个动态分配空间
下面的可以解决,当我感觉好好像特别浪费空间
Worker **newSpace = new Worker*[newSize*sizeof(Worker)];
最佳答案
2024-3-6 14:07:35
叶落了 发表于 2024-03-06 14:07
//开辟新空间
Worker **newSpace = new Worker*;  / ...


根据您提供的信息,代码中的问题主要是在动态分配空间时出现了错误。在您的代码中,`Worker **newSpace = new Worker*;`这行应该修改为`Worker **newSpace = new Worker*[newSize];`,其中`newSize`应该是用户输入的子类数量。

此外,根据您似乎给出的出错信息,还有可能存在其他问题。例如,错误提示中显示“可写范围是0到0”,这表明您可能没有正确设置循环的范围或索引变量。

以下是对您提供的代码的修改建议:
// 开辟新空间并初始化为空指针数组
int newSize;
cout << "请输入新分配的子类数量:";
cin >> newSize;
Worker** newSpace = new Worker*[newSize];

// 在这里进行相应操作,例如循环遍历赋值等

// 释放内存
for (int i = 0; i < newSize; i++) {
    delete newSpace[i];
}
delete[] newSpace;

请注意,在创建的指针数组上进行操作之前,请确保将其正确初始化和赋值。此外,别忘了使用`delete[]`来释放动态分配的数组内存空间。

希望这次能够帮助您解决问题!如果问题仍然存在,请提供更多完整的代码和错误信息以便更好地帮助您。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-5 21:49:50 | 显示全部楼层
在您的代码中,缓冲区数据溢出的原因是因为您没有指定新空间的大小。当您使用`new Worker*`时,实际上只是创建了一个单独的指针,而没有分配新的内存空间。

要解决这个问题,您需要指定分配的内存空间大小,以容纳您想要的子类数量。假设您想要分配10个子类对象,可以这样修改代码:
int newSize = 10;
Worker** newSpace = new Worker*[newSize];

请注意,这样的操作将在堆上分配了一个指针数组,每个元素都是指向Worker对象的指针。使用完后,不要忘记释放内存:
delete[] newSpace;

这样,您就可以正确地分配和释放内存,并避免缓冲区数据溢出的问题。希望对您有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-5 23:08:25 | 显示全部楼层
如何动态分配空间呢?
newSize是要后面输入的变量(用户输入的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-5 23:08:40 | 显示全部楼层
叶落了 发表于 2024-03-05 23:08
如何动态分配空间呢?
newSize是要后面输入的变量( ...


要根据用户输入的变量动态分配空间,可以使用动态内存分配运算符`new[]`来创建一个指针数组。下面是一个示例代码:
int newSize;
cout << "请输入子类数量: ";
cin >> newSize;

Worker** newSpace = new Worker*[newSize];

// 在这里进行相应操作

delete[] newSpace;

在上述代码中,首先声明了一个整型变量`newSize`用于接收用户输入的子类数量。然后通过使用`new[]`运算符分配一个指针数组`newSpace`,数组大小为`newSize`。接下来,您可以在需要的地方进行对这个指针数组的操作。

最后,使用`delete[]`运算符释放分配的内存空间。记住,当您使用`new[]`分配内存时,应该使用对应的`delete[]`来释放相应的内存空间。

希望这个例子能够帮助您理解动态分配空间的方法!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-3-6 00:23:16 | 显示全部楼层
什么溢出了?
你这申请了newSize个指针么,有什么问题?
怎么溢出了?

点评

评:不会问问题,对AI更感兴趣  发表于 2024-3-6 15:19
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2024-3-6 13:56:14 | 显示全部楼层
FishC 发表于 2024-3-5 23:08
要根据用户输入的变量动态分配空间,可以使用动态内存分配运算符`new[]`来创建一个指针数组。下面是一 ...

可是在Vs中,在运行之前会检查,然后它就报错,说newSpace是一元素数组
在循环到到下面的i=1 时会溢出,可写范围是0到0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-6 13:56:25 | 显示全部楼层
叶落了 发表于 2024-03-06 13:56
可是在Vs中,在运行之前会检查,然后它就报错,说newS ...


如果您在运行程序之前就报告了数组越界错误,有可能是因为在声明指针数组时没有为其指定正确的大小。请确保在使用动态内存分配运算符`new`时,将用户输入的变量`newSize`作为数组大小。下面是一个修正后的示例代码:int newSize;cout << "请输入子类数量: ";cin >> newSize;Worker** newSpace = new Worker*[newSize];for(int i=0; i < newSize; i++){ // 在这里对指针数组进行操作}delete[] newSpace;在上述代码中,我们使用`new`运算符和方括号来创建大小为`newSize`的指针数组`newSpace`。然后我们可以根据需要,在循环中对数组进行操作。最后,使用`delete[]`来释放整个数组占用的内存空间。这样做应该能够解决数组溢出的问题。希望这次能解决您的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-6 13:57:05 | 显示全部楼层
#include"workerManager.h"

//构造函数
WorkerManager::WorkerManager()
{
        this->m_EmpArray = NULL;
}

//展示菜单
void WorkerManager::Show_menu()
{
        cout << "*******************************************" << endl;
        cout << "********** 欢迎使用职工管理系统!**********" << endl;
        cout << "*************  0.退出管理系统  ************" << endl;
        cout << "*************  1.增加职工信息  ************" << endl;
        cout << "*************  2.显示职工信息  ************" << endl;
        cout << "*************  3.删除离职员工  ************" << endl;
        cout << "*************  4.修改职工信息  ************" << endl;
        cout << "*************  5.查找职工信息  ************" << endl;
        cout << "*************  6.按照编号排序  ************" << endl;
        cout << "*************  7.清空所有文档  ************" << endl;
        cout << "*******************************************" << endl;
        cout<<"" << endl;
}

//退出系统
void WorkerManager::ExitSystem()
{
        cout << "欢迎下次使用" << endl;
        system("pause");
        exit(0);
}

//添加职工
void WorkerManager::Add_Emp()
{
        cout << "请输入职工的数量" << endl;
       
        int addNum = 0;//保存用户输入的数量
        cin >> addNum;

        if (addNum > 0)
        {
                //添加
                //计算添加新空间的大小
                int newSize = this->m_Empnum + addNum;

                //开辟新空间
                Worker **newSpace = new Worker*[newSize*2];

                //将原来空间下的数据,复制的新空间下
                if (this->m_Empnum != 0)
                {
                        for (int i = 0; i < m_Empnum; i++)
                        {
                                newSpace[i] = this->m_EmpArray[i];
                        }
                }

                int id;//职工编号
                string name;//职工姓名
                int dSelect;//部门选择

                //开始添加新数据
                for (int i = 0; i < addNum; i++)
                {
                        cout << "请输入" << i + 1 << "个新职工编号" << endl;
                        cin >> id;
                        cout << "请输入" << i + 1 << "个新职工姓名" << endl;
                        cin >> name;
                        cout << "请选择该职工岗位" << endl;
                        cout << "1.普通职位" << endl;
                        cout << "2.经理" << endl;
                        cout << "3.老板" << endl;
                        cin >> dSelect;
                        Worker* worker = NULL;
                        switch (dSelect)
                        {
                        case(1):
                        {
                                worker = new Employee(id, name, dSelect);
                                break;
                        }
                        case(2):
                        {
                                worker = new Manage(id, name, dSelect);
                                break;
                        }
                        case(3):
                        {
                                worker = new Boss(id, name, dSelect);
                                break;
                        }
                        default:
                                break;
                        }
                        //将创建职工职责,保存到数组中
                        newSpace[this->m_Empnum + i] = worker;
                }
               
                //释放原有空间
                delete[] this->m_EmpArray;//释放了存指针的数组而已,指针已经转移(复制了)
               
                //更改新空间的指向
                this->m_EmpArray = newSpace;

                //更新新的职工人数
                this->m_Empnum = newSize;

                //提示添加成功
                cout << "成功添加" << addNum << "名新职工" << endl;
               
                //保存文件
                this->save();
        }
        else
        {
                cout << "输入数据有误" << endl;
        }
}

void WorkerManager::save()
{
        ofstream ofs;
        ofs.open(FILENAME, ios::out);//用输出的方式打开文件  --写文件

        //将每个人的数据写入到文件中
        for (int i = 0; i < this->m_Empnum; i++)
        {
                ofs << this->m_EmpArray[i]->m_Id << " "
                        << this->m_EmpArray[i]->m_Name << " "
                        << this->m_EmpArray[i]->m_DeptId << endl;

        }

        //关闭文件
        ofs.close();
}

//析构函数
WorkerManager::~WorkerManager()
{
        if (this->m_EmpArray != NULL)
        {
                delete[]this->m_EmpArray;
                this->m_EmpArray = NULL;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-6 13:57:14 | 显示全部楼层
叶落了 发表于 2024-03-06 13:57
#include"workerManager.h"

//构造函数
WorkerMan ...


你的代码中似乎出现了截断,无法看到完整的内容。不过根据你提供的信息,我可以看到你在构造函数`WorkerManager::WorkerManager()`中将`m_EmpArray`初始化为`NULL`,这是一个好的做法。

另外,你提到要展示菜单,但代码中出现了截断。如果你需要在控制台中展示菜单,你可以使用如下代码:
void WorkerManager::Show_menu() {
    cout << "********** 欢迎使用员工管理系统 **********" << endl;
    cout << "1. 添加员工" << endl;
    cout << "2. 显示全部员工" << endl;
    cout << "3. 删除员工" << endl;
    cout << "4. 修改员工信息" << endl;
    cout << "5. 查找员工" << endl;
    cout << "6. 排序员工" << endl;
    cout << "7. 清空所有员工" << endl;
    cout << "0. 退出系统" << endl;
    cout << "*****************************************" << endl;
}

这段代码会在控制台中打印出一个简单的菜单。你可以根据需要进行修改和完善。

希望这能帮助到你!如果你有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-6 14:07:20 | 显示全部楼层
//开辟新空间
Worker **newSpace = new Worker*[newSize*2];  //这里多了个2,无所谓,删掉也会报错。*2就变成了2元素数组

还有一些头文件没复制,应该可以看出。  
我把它报错的原因复述吧
49" newSpace "是一个1元素数组(8字节)
52跳过此分支(假定" this -> m _ Empnum !=0"为 false )
65进入此循环(假定" i < addNum ")
77假定 switch (" dSelect ")解析为 case (1):
65继续此循环(假定" i < addNum ")
77假定 switch (" dSelect ")解析为 case (1):
98写入到" newSpace [1]"无效(可写范围是0到0)
workerManager . cpp (行98)
写入 "newSpace "时缓冲区溢出。


我尝试强行运行,但输入添加职工大于2的话程序就崩溃了//在 Worker **newSpace = new Worker*[newSize]; 下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-6 14:07:35 | 显示全部楼层    本楼为最佳答案   
叶落了 发表于 2024-03-06 14:07
//开辟新空间
Worker **newSpace = new Worker*;  / ...


根据您提供的信息,代码中的问题主要是在动态分配空间时出现了错误。在您的代码中,`Worker **newSpace = new Worker*;`这行应该修改为`Worker **newSpace = new Worker*[newSize];`,其中`newSize`应该是用户输入的子类数量。

此外,根据您似乎给出的出错信息,还有可能存在其他问题。例如,错误提示中显示“可写范围是0到0”,这表明您可能没有正确设置循环的范围或索引变量。

以下是对您提供的代码的修改建议:
// 开辟新空间并初始化为空指针数组
int newSize;
cout << "请输入新分配的子类数量:";
cin >> newSize;
Worker** newSpace = new Worker*[newSize];

// 在这里进行相应操作,例如循环遍历赋值等

// 释放内存
for (int i = 0; i < newSize; i++) {
    delete newSpace[i];
}
delete[] newSpace;

请注意,在创建的指针数组上进行操作之前,请确保将其正确初始化和赋值。此外,别忘了使用`delete[]`来释放动态分配的数组内存空间。

希望这次能够帮助您解决问题!如果问题仍然存在,请提供更多完整的代码和错误信息以便更好地帮助您。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表