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

为什么这个简单的strcat会在运行时崩溃?,c,string,char,printf,strcat,C,String,Char,Printf,Strcat,由于某种原因,在多年不使用C编程后,我无法实现这一点: (这编译时没有任何抱怨,但会导致崩溃,当我删除strcat行时,可执行文件运行正常) 您的代码正在崩溃,因为您没有在clibdir中分配足够的空间来保存初始字符串和附加字符串,因此您的缓冲区溢出。问题是,您已经破坏了main()函数的返回堆栈,因此当您从main()程序返回时,程序会失控并崩溃。您可能会发现,如果替换返回0带退出(0),您的程序不再崩溃。这是巧合-不是推荐的修复方法 这个故事的寓意是“确保你附加的字符串有足够的空间” 合理的

由于某种原因,在多年不使用C编程后,我无法实现这一点:

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


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

这个故事的寓意是“确保你附加的字符串有足够的空间”

合理的解决办法是将
clibdir
的大小从50增加到至少60


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

char clibdir[50] = "\\libraries\\c";
而不是:

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

没有人能理解为什么代码会崩溃——因为,事实上,原始代码不应该崩溃。

您的代码会崩溃,因为您在
clibdir
中没有分配足够的空间来容纳初始字符串和附加字符串,所以缓冲区溢出。问题是,您已经破坏了
main()
函数的返回堆栈,因此当您从
main()
程序返回时,程序会失控并崩溃。您可能会发现,如果替换
返回0
退出(0),您的程序不再崩溃。这是巧合-不是推荐的修复方法

这个故事的寓意是“确保你附加的字符串有足够的空间”

合理的解决办法是将
clibdir
的大小从50增加到至少60


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

char clibdir[50] = "\\libraries\\c";
而不是:

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

没有人能理解为什么代码会崩溃——因为,事实上,原始代码不应该崩溃。

您的代码会崩溃,因为您在
clibdir
中没有分配足够的空间来容纳初始字符串和附加字符串,所以缓冲区溢出。问题是,您已经破坏了
main()
函数的返回堆栈,因此当您从
main()
程序返回时,程序会失控并崩溃。您可能会发现,如果替换
返回0
退出(0),您的程序不再崩溃。这是巧合-不是推荐的修复方法

这个故事的寓意是“确保你附加的字符串有足够的空间”

合理的解决办法是将
clibdir
的大小从50增加到至少60


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

char clibdir[50] = "\\libraries\\c";
而不是:

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

没有人能理解为什么代码会崩溃——因为,事实上,原始代码不应该崩溃。

您的代码会崩溃,因为您在
clibdir
中没有分配足够的空间来容纳初始字符串和附加字符串,所以缓冲区溢出。问题是,您已经破坏了
main()
函数的返回堆栈,因此当您从
main()
程序返回时,程序会失控并崩溃。您可能会发现,如果替换
返回0
退出(0),您的程序不再崩溃。这是巧合-不是推荐的修复方法

这个故事的寓意是“确保你附加的字符串有足够的空间”

合理的解决办法是将
clibdir
的大小从50增加到至少60


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

char clibdir[50] = "\\libraries\\c";
而不是:

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

没有人能理解为什么代码会崩溃——因为,事实上,原始代码不应该崩溃。

它不会对我造成崩溃。
strcat()
会写入
clibdir
,它是用字符串文字初始化的。根据编译器选项,
clibdir
可以转换为指向受保护数据节的指针。在该位置写入将导致未定义的行为。@SleuthEye否,它被声明为
char[50]
,它将进入可写位置,是的,clibdir变量大于50个字符,这导致了错误。大小为100就可以了。如果您不向我们显示实际崩溃的代码,您希望我们如何调试您的问题?问题的原始版本显示
char-clibdir[50]=“\\libraries\\c”非常短,没有问题。修改后的版本仍然有一个只有50个字符长的变量,但它是用45个字符初始化的,因此向其中添加14个左右的变量会溢出缓冲区,并且在出现崩溃报告时,会设法将堆栈丢弃—这称为一个。现在看起来很简单,但这仅仅是因为您向我们展示了实际上正在崩溃的代码!它没有给我造成崩溃。
strcat()
将写入
clibdir
,该文件由字符串文本初始化。根据编译器选项,
clibdir
可以转换为指向受保护数据节的指针。在该位置写入将导致未定义的行为。@SleuthEye否,它被声明为
char[50]
,它将以可写的方式进行