zhdysc 2021-09-20 01:34 采纳率: 100%
浏览 504
已结题

C++超出栈堆的字节


#include<iostream>
using namespace std;
#include<iostream>
#define MAX 1000
struct Person
{
    string m_Name;
    int m_Sex;
    int m_Age;
    string m_Phone;
    string m_Addr;
};
struct Addressbooks
{
    struct Person personArray[MAX];
    int m_Size;
};
void addPerson(Addressbooks* abs)
{
    if (abs->m_Size = MAX)
    {
        cout << "通讯录已满,无法添加!" << endl;
        return;
    }
    else
    {
        string name;
        cout << "请输入姓名: " << endl;
        cin >> name;
        abs->personArray[abs->m_Size].m_Name = name;
    }
}
void showMenu()
{
    cout << "*************************" << endl;
    cout << "***** 1、添加联系人 *****" << endl;
    cout << "***** 2、显示联系人 *****" << endl;
    cout << "***** 3、删除联系人 *****" << endl;
    cout << "***** 4、查找联系人 *****" << endl;
    cout << "***** 5、修改联系人 *****" << endl;
    cout << "***** 6、清空联系人 *****" << endl;
    cout << "***** 0、退出通讯录 *****" << endl;
    cout << "*************************" << endl;
}
int main()
{
    Addressbooks abs;
    abs.m_Size = 0;
    int select = 0;
    while (true)
    {
        showMenu();
        cin >> select;
        switch (select)
        {
        case 1:
            addPerson(&abs);
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 0:
            cout << "欢迎下次使用" << endl;
            system("pause");
            return 0;
            break;
        default:
            break;
        }
    }
    system("pause");
    return 0;
}

警告 C6262 函数使用了堆栈的“92008”个字节: 超过了 /analyze:stacksize '16384'。 请考虑将某些数据移到堆中。
跟别人一样的代码却出现这种情况,怎么简单解决

  • 写回答

1条回答 默认 最新

  • bostonAlen 2021-09-20 02:05
    关注

    使用2017没有这个警告,不知道你用的是哪个版本。
    对于vs2008可以参考如下:

    警告 C6262:函数使用了堆栈中的 个字节: 超过了 /analyze:stacksize。请考虑将某些数据移到堆中

    此警告指出在函数内检测到了超出预设阈值的堆栈使用率。默认情况下,当堆栈大小超过 16K 字节时会生成此警告。堆栈是有限的,甚至在用户模式下也是如此,如果无法提交堆栈页,会导致堆栈溢出异常。_resetstkoflw 函数可以将系统从堆栈溢出的情况恢复为正常,从而使程序得以继续运行,而不会由于出现异常错误而失败。如果未调用 _resetstkoflw函数,则在上一个异常后不会显示保护页。当下次发生堆栈溢出时,根本不会显示异常,进程将在没有任何警告的情况下终止。

    若要更正此警告,1、既可以将一些数据移至堆,2、也可以增加堆栈大小。无论采取哪一种更正措施,在对代码进行更改前均应考虑到所用方法的利弊

    此处
    struct Person personArray[MAX];
    sizeof(personArray) = 92字节
    personArray[MAX]; = 92000字节
    也就是92000/1024 = 89k 左右,应该是超了
    解决
    1。 对于报这个警告的函数,当作对自己的一个提醒(Reminder),让我们再评估一下,有无必要使用这么大的堆栈;可否使用动态内存(堆)再或者使用全局变量代替?
    2。如果评估的结果仍然大于16K,但是没有超过太多的话请忽视这个警告而不要修改编译参数让它不出现。

    注:你可以试试在max后面多加几个0,看看编译器编译和运行的情况,每个编译器栈区大小应该是不同的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看