当前位置:  开发笔记 > 编程语言 > 正文

运行时检查失败#2 - 变量'x'周围的堆栈已损坏

如何解决《运行时检查失败#2-变量'x'周围的堆栈已损坏》经验,为你挑选了1个好方法。

我在以下代码中返回时收到此运行时检查失败.我相信类似的代码在程序的其他地方运行良好.有任何想法吗?

String GetVariableName(CString symbol, CString filepath)
{
    char acLine[512];
    char acPreviousLine[512];
    CString csFile;
    FILE *fp;   

    csFile.Format("%svariables.txt", filepath);

    fp = fopen(csFile, "r");

    if (! fp)
        return("");

    for (;;)
    {
        strcpy(acPreviousLine, acLine);

        // NULL means we are out of lines in the file.
        if (myfgets(acLine, 511, fp) == NULL)
            break;

        // "END" indicates end of file
        if (! strcmp(acLine, "END"))
            break;

        if (! strcmp(acLine, csVarSymbol))
        {
            // Previous line should be variable name
            fclose(fp);

            // Following line results in Check Failure while in Debug mode
            return(acPreviousLine);
        }
    }   
    fclose(fp);
    return("");
}

Airsource Lt.. 17

在上面的例子中没有变量'x',但我猜你编辑了错误信息!

acLine未初始化,因此第一次将其复制到acPreviousLine时,您正在复制堆栈中发生的任何事情.这可能会给你一个缓冲区溢出,因此在某些情况下堆栈损坏 - 不是全部,因为你可能很幸运,在你到达512字节之前在acLine中找到一个null.

在返回时检查堆栈是否有损坏,因为在所有堆栈变量周围插入保护字(在此平台和构建配置上 - 我假设在Windows上,在VS上以调试模式编译)以检查该问题.

将acLine [0]初始化为0.



1> Airsource Lt..:

在上面的例子中没有变量'x',但我猜你编辑了错误信息!

acLine未初始化,因此第一次将其复制到acPreviousLine时,您正在复制堆栈中发生的任何事情.这可能会给你一个缓冲区溢出,因此在某些情况下堆栈损坏 - 不是全部,因为你可能很幸运,在你到达512字节之前在acLine中找到一个null.

在返回时检查堆栈是否有损坏,因为在所有堆栈变量周围插入保护字(在此平台和构建配置上 - 我假设在Windows上,在VS上以调试模式编译)以检查该问题.

将acLine [0]初始化为0.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有