繁体   English   中英

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

[英]String literals: pointer vs. char array

在本声明中:

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超出范围时,该内存被释放。

查看字符数组的文字字符串初始化程序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM