gpt4 book ai didi

c++ - Linux 上 C 中字符数组和指针的段错误

转载 作者:IT老高 更新时间:2023-10-28 22:23:41 32 4
gpt4 key购买 nike

所以我有以下程序:

int main(){
char* one = "computer";
char two[] = "another";
two[1]='b';
one[1]='b';
return 0;
}

它在 "one[1]='b'"行上出现段错误,这是有道理的,因为指针 "one"指向的内存必须在只读内存中。但是,问题是为什么“two[1]='b'”行没有段错误?查看 gcc 的程序集输出:

.file   "one.c"
.section .rodata
.LC0:
.string "computer"
.LC1:
.string "another"
.text
.globl main
.type main, @function
main:

我们看到两个字符串都在rodata 部分,所以它们是只读的。那么“two[1]='b'”这行怎么没有段错误呢?

最佳答案

one 直接指向位于只读页面中的字符串。另一方面,two 是分配在堆栈上的数组,并使用一些常量数据进行初始化。在运行时,可执行文件的只读部分中的字符串将被复制到堆栈中。您正在修改的是堆栈上该字符串的拷贝,而不是只读内存页面。

从更高层次的角度来看,从语言的角度来看,"abcd"const char* 类型的表达式,而不是 char*。因此,修改此类表达式所指向的值会导致未定义的行为。语句 char* one = "something"; 仅将指向字符串的指针存储在变量中(不安全,因为它正在丢弃 const 修饰符)。 char two[] = "something"; 完全不同。它实际上是声明一个数组并对其进行初始化,很像 int a[] = {1,2,3};。这里引号中的字符串是初始化表达式。

关于c++ - Linux 上 C 中字符数组和指针的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773079/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com