为什么程序在编辑固定字符串时不会抛出段错误?

Why doesn't the program throw segfault error on editing fixed string?

我是 Unions 的新手。在下面的代码中,根据我的理解,我们正在通过尝试用 'S' 代替 G 来替换固定字符串文字“GeeksQuiz”。它不应该抛出一些段错误。如果不是那么为什么答案不是“SeeksQuiz”而是“GeeksQuiz”?

# include <iostream> 
# include <string.h> 
using namespace std; 
  
struct Test 
{ 
  char str[20]; 
}; 
  
int main() 
{ 
  struct Test st1, st2; 
  strcpy(st1.str, "GeeksQuiz"); 
  st2 = st1; 
  st1.str[0] = 'S'; 
  cout << st2.str; 
  return 0; 
} 

让我逐行分解这里发生的事情:

  1. Struct Test st1, st2; 创建两个本地结构测试。这些不是指针/引用,而是结构本身。 如果您尝试打印结构,它们将具有随机字符,因为 str 未初始化。

  2. strcpy(st1.str, "GeeksQuiz"); 将字符串文字 GeeksQuiz 复制到 st1.str,因此 st1.str 应该有带有空终止字符的 GeeksQuiz。

  3. st2 = st1; 我们将 st1 设置为等于 st2。两者都不是指针或引用,(平面对象)所以它喜欢

    int a = 5;
    int b = 6;
    a = b; // a = 6
    a = 7; // a = 7, b is still 6
    

所以 st2.str = GeeksQuiz,st1.str = GeeksQuiz,但它们 (st1, st2) 都是独立的实体。

  1. st1.str[0] = 'S'; st1.str = SeeksQuiz,st2.str = GeeksQuiz。

  2. cout << st2.str; st2.str = GeeksQuiz,这是输出的内容。

我们无处尝试更改实际文字本身,只要我们使用文字来初始化某些东西,它就会被复制到那个变量。我希望所有这些都能澄清您的问题。

如果 st1st2 是指向结构的指针,那么设置 st1 = st2 两者将指向内存中的同一个位置,因此通过 *st1 进行更改将是*st2 中也有体现,但此处并非如此。