首页 > 解决方案 > 为什么程序在编辑固定字符串时不抛出段错误?

问题描述

我是工会的新手。在下面的代码中,根据我的理解,我们正在编辑一个固定的字符串文字“GeeksQuiz”,尝试用 'S' 代替 G。它不应该抛出一些段错误。如果不是,那么为什么答案不是 "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; 
} 

标签: segmentation-faultstructureunions

解决方案


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

  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其中,但这里不是这种情况。


推荐阅读