为什么程序在编辑固定字符串时不会抛出段错误?
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;
}
让我逐行分解这里发生的事情:
Struct Test st1, st2;
创建两个本地结构测试。这些不是指针/引用,而是结构本身。
如果您尝试打印结构,它们将具有随机字符,因为 str 未初始化。
strcpy(st1.str, "GeeksQuiz");
将字符串文字 GeeksQuiz 复制到 st1.str,因此 st1.str 应该有带有空终止字符的 GeeksQuiz。
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) 都是独立的实体。
st1.str[0] = 'S';
st1.str = SeeksQuiz,st2.str = GeeksQuiz。
cout << st2.str;
st2.str = GeeksQuiz,这是输出的内容。
我们无处尝试更改实际文字本身,只要我们使用文字来初始化某些东西,它就会被复制到那个变量。我希望所有这些都能澄清您的问题。
如果 st1
和 st2
是指向结构的指针,那么设置 st1 = st2
两者将指向内存中的同一个位置,因此通过 *st1
进行更改将是*st2
中也有体现,但此处并非如此。
我是 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;
}
让我逐行分解这里发生的事情:
Struct Test st1, st2;
创建两个本地结构测试。这些不是指针/引用,而是结构本身。 如果您尝试打印结构,它们将具有随机字符,因为 str 未初始化。strcpy(st1.str, "GeeksQuiz");
将字符串文字 GeeksQuiz 复制到 st1.str,因此 st1.str 应该有带有空终止字符的 GeeksQuiz。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) 都是独立的实体。
st1.str[0] = 'S';
st1.str = SeeksQuiz,st2.str = GeeksQuiz。cout << st2.str;
st2.str = GeeksQuiz,这是输出的内容。
我们无处尝试更改实际文字本身,只要我们使用文字来初始化某些东西,它就会被复制到那个变量。我希望所有这些都能澄清您的问题。
如果 st1
和 st2
是指向结构的指针,那么设置 st1 = st2
两者将指向内存中的同一个位置,因此通过 *st1
进行更改将是*st2
中也有体现,但此处并非如此。