字符串文字:指针与字符数组

Jey*_*ram 9 c segmentation-fault string-literals

在这个声明中:

char *a = "string1"
Run Code Online (Sandbox Code Playgroud)

究竟什么是字符串文字?是string1吗?因为这个线程C和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;
} 
Run Code Online (Sandbox Code Playgroud)

请添加除上述要点之外的一些细节.谢谢.

调试输出显示错误 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
Run Code Online (Sandbox Code Playgroud)

Lih*_*ihO 18

您可以将字符串文字视为"由双引号括起来的字符序列".此字符串存储在只读内存中,尝试修改此内存会导致未定义的行为.

那你怎么得到分段错误呢?
-主要的一点是,char *ptr = "string literal"使ptr以指向您的字符串是存储在只读存储器.因此,当您尝试访问此内存时:(ptr[0] = 'X'这相当于*(ptr + 0) = 'X'),这是一种内存访问冲突.

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

看一下字符数组的Literal字符串初始值设定项