在任何步骤之前,C中的堆栈溢出错误

时间:2011-06-07 15:41:36

标签: c visual-studio-2008 stack-overflow

当我尝试调试我的C程序时,甚至在编译器开始执行任何行之前我得到: “HistsToFields.exe中0x00468867处的未处理异常:0xC00000FD:堆栈溢出。”

我不知道如何发现问题,因为程序甚至没有开始执行任何行(或者至少这是我从编译器调试窗口中看到的)。如果我的程序还没有执行任何一行,怎么能告诉导致溢出的原因? “调试器打破它的时间指向chkstk.asm中的一行”

我在win7上使用Microsoft Visual Studio 2008。

我将Stack Reserve Size设置为300000000

PS:用于在另一台机器上执行罚款的程序。

我有一个csv格式的数据库(120000 x 60),我需要将其更改为空格分隔。该程序(我自己没有写)定义了输出文件的结构:

`struct  OutputFileContents {
    char    Filename[LINE_LEN];
    char    Title[LINE_LEN];
    int NVar;
    char    VarName[MAX_NVAR][LINE_LEN];
    char    ZoneTitle[LINE_LEN];
    int     NI;
    int     NJ;
    int     NK;
    double  Datums[MAX_NVAR];
    double  Data[MAX_NVAR][MAX_NPOINT];`  

最后一个数组“Data [] []”包含所有输出。因此是巨大的尺寸。 此数组大小“MAX_NPOINT”在项目的标题源文件中设置,此标题由项目中的多个程序使用。

非常感谢您提前。 艾哈迈德。

1 个答案:

答案 0 :(得分:3)

首先,IDE!=编译器!=调试器。

其次,无论为什么调试器无法调试应用程序 - 堆栈中巨大的数据集是严重的设计错误。修复设计错误,调试器问题就会消失。

至于调试器失败的原因......不知道。安装的RAM太少了? 32位对64位平台?构造静态变量的无限递归?如果不看你没有向我们展示的东西,比如来源,环境规格等,就不能说真的。

编辑:如果错过了提示:在main()开始执行之前构建全局/静态数据对象。这些构造函数中的无限(或刚刚太深)递归可以触发堆栈溢出。 (我假设C ++而不是C,因为您给出的错误消息显示“未处理的异常”。)

编辑2:您添加了一个“数据库”,您需要将其转换为以空格分隔。没有看到你的其余代码:尝试在内存中一次完成整个转换并不是一个好主意。读取记录,转换,写入。重复。如果您需要“最长记录”之类的东西来确定输出格式,请将只读的输入迭代一次以查找输出大小,然后再次迭代进行实际转换。