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



在此语句中:

char *a = "string1"

字符串文字究竟是什么?是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;
} 

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

调试输出显示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字符串初始值设定项

相关内容

  • 没有找到相关文章

最新更新