为什么这个简单的strcat会在运行时崩溃?

时间:2015-01-10 01:56:31

标签: c string char printf strcat

由于某种原因,在多年没有使用C语言编程后,我无法完成这项工作:

(编译时没有抱怨但导致崩溃,当我删除strcat行时,可执行文件正常运行)

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv){
    char clibdir[50] = "C:\\Users\\______000\\Desktop\\nodeC\\libraries\\c";
    char varsfile[20] = "\\variables.xml";
    printf("%s\n", clibdir);  //ok
    printf("%s\n", varsfile); //ok
    char *varspath = strcat(clibdir, varsfile);  //this is provoking a crash
    printf("%s\n", clibdir);  //prints right before crash
    printf("%s\n", varspath); //prints right before crash
    return 0;
}

这打印得很完美,但它崩溃了我的exe。这是我的命令行(我使用Visual Studio 2010中的cl.exe):

"%vcbin%\vcvars32.bat" && "%vcbin%\cl.exe" /nologo /EHsc main.cpp /link /subsystem:console

1 个答案:

答案 0 :(得分:3)

您的代码崩溃了,因为您没有在clibdir中分配足够的空间来保存初始字符串和附加字符串,因此您有缓冲区溢出。问题是,您已经从main()函数中删除了返回堆栈,因此当您从main()程序返回时,程序会出现问题并崩溃。您可能会发现,如果您将return 0;替换为exit(0);,您的程序就不会再崩溃了。这是巧合 - 不是推荐的解决方案。

故事的寓意是&#34;确保有足够的空间容纳你追加的字符串&#34;!

理智的解决方法是将clibdir的大小从50增加到至少60。


...而且......当您提出问题时,请确保您在问题中显示的代码实际上与您在计算机上运行的代码崩溃相同。该问题的原始版本有:

char clibdir[50] = "\\libraries\\c";

而不是:

char clibdir[50] = "C:\\Users\\______000\\Desktop\\nodeC\\libraries\\c";

并且没有人能够理解代码崩溃的原因 - 因为实际上原始代码不应该崩溃。