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