c - 为什么 strcpy 会触发全局变量的分段错误?

Avatar
admin

正如其他海报所提到的,问题的根源在于 temp 未初始化。当声明为堆栈上的自动变量时,它将包含该内存位置中发生的任何垃圾。显然,对于您正在运行的编译器+CPU+OS,该位置的垃圾是一个有效的指针。strcpy “成功”在于它没有段错误,但实际上它将字符串复制到内存中其他位置的任意位置。这种内存损坏问题让世界各地的 C 程序员感到恐惧,因为它非常难以调试。

当您将临时变量声明移动到全局范围时,它被放置在 BSS 部分并自动归零。尝试取消引用 *temp 然后会导致段错误。

当您将 *path 移动到全局范围时, *temp 会在堆栈上向上移动一个位置。该位置的垃圾显然不是有效的指针,因此取消引用 *temp 会导致段错误。