2008-11-06 100 views
3

在下列代码返回时收到此运行时检查失败。我相信程序中其他地方的类似代码运行良好。有任何想法吗?运行时检查失败#2 - 变量'x'周围的堆栈已损坏

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(""); 
} 
+0

在示例中围绕哪个变量堆栈? – Mathias 2008-11-06 14:00:25

回答

17

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

acLine没有初始化,所以当您第一次将它复制到acPreviousLine时,您正在复制堆栈上发生的任何事情。这可能会给你一个缓冲区溢出,因此在某些情况下堆栈损坏 - 并非全部,因为你可能很幸运,并且在达到512字节之前在acLine中找到空值。

由于在所有堆栈变量周围插入了保护字(在这个平台上和构建配置 - 我认为它在Windows上,在调试模式下在VS上编译),检查堆栈是否损坏问题。

将acLine [0]初始化为0.

相关问题