所以我有一些 C 代码:
#include <stdio.h>
#include <string.h>
/* putting one of the "char*"s here causes a segfault */
void main() {
char* path = "/temp";
char* temp;
strcpy(temp, path);
}
这会编译、运行并按其外观运行。但是,如果一个或两个字符指针被声明为全局变量,则 strcpy 会导致段错误。为什么会这样?显然我对作用域的理解有误。
最佳答案
正如其他发帖者所提到的,问题的根源在于 temp 未初始化。当声明为堆栈上的自动变量时,它将包含恰好位于该内存位置的任何垃圾。显然对于您正在运行的编译器+CPU+OS,该位置的垃圾是一个有效的指针。 strcpy 的“成功”在于它不会出现段错误,但实际上它是将字符串复制到内存中其他地方的任意位置。这种内存损坏问题让各地的 C 程序员心生恐惧,因为它异常难以调试。
当您将临时变量声明移动到全局范围时,它被放置在 BSS 部分并自动归零。尝试取消引用 *temp 会导致段错误。
当您将 *path 移动到全局范围时,*temp 将在堆栈中向上移动一个位置。该位置的垃圾显然不是有效指针,因此取消引用 *temp 会导致段错误。
关于c - 为什么 strcpy 会触发全局变量的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/122877/