gpt4 book ai didi

c - 字符串文字 : pointer vs. 字符数组

转载 作者:太空狗 更新时间:2023-10-29 16:52:14 24 4
gpt4 key购买 nike

在这个声明中:

char *a = "string1"

究竟什么是字符串字面量?是 string1 吗?因为这个线程 What is the type of string literals in C and C++? 说的不一样。

据我所知

int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.

a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.

return 0;
}

除上述几点外,请补充一些细节。谢谢。

调试输出显示错误 a[0] = 'Y';

Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: file ddd.c, line 4.
(gdb) r
Starting program: /home/jay/Desktop/MI/chararr/a.out

Breakpoint 1, main () at ddd.c:4
4 {
(gdb) n
6 char *a = "string1";
(gdb) n
7 char b[] = "string2";
(gdb)
9 a[0] = 'Y';
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400595 in main () at ddd.c:9

最佳答案

您可以将字符串文字视为“由双引号括起来的字符序列”。此字符串应被视为只读,并且尝试修改此内存会导致未定义的行为。它不一定存储在只读内存中,类型是 char[] 而不是 const char[],但它仍然是未定义的行为。类型不是 const 的原因是向后兼容性。 C 在开始时没有 const 限定符。在 C++ 中,字符串文字的类型为 const char[]

那你怎么会出现段错误呢?

  • 要点是 char *ptr = "string literal" 使 ptr 指向存储字符串文字的只读内存。因此,当您尝试访问此内存时:ptr[0] = 'X'(顺便说一下,这等同于 *(ptr + 0) = 'X') ,这是一个内存访问冲突

另一方面:char b[] = "string2"; 分配内存并将字符串"string2" 复制到其中,因此修改它是有效的。此内存在 b 超出范围时释放。

看看Literal string initializer for a character array

关于c - 字符串文字 : pointer vs. 字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12795850/

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