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

标签 c scope pointers segmentation-fault character

所以我有一些 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/

相关文章:

c - goto 会违反互斥锁吗?

c++ - RegCreateKeyEx - 它会在失败时更新返回的句柄吗?

javascript - Undefined 不是评估 this.state/this.props 的对象

javascript - 如何在 JavaScript 中不使用 `window` 检查动态全局变量?

c - 如何在C中返回一个二维指针?

c++ - 如何转换指针以调用派生类函数/方法? C++

c - 结构指针中需要一些说明

c++ - 在 pthread 中附加类的成员函数

C - char scanf问题

javascript - 除非全局声明,否则无法从事件处理程序内的函数更新变量