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

Posted

技术标签:

【中文标题】字符串文字:指针与字符数组【英文标题】:String literals: pointer vs. char array 【发布时间】:2022-01-08 01:03:07 【问题描述】:

在此声明中:

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

【问题讨论】:

@elyashiv,代码是非法的,因为它试图修改字符串文字。 我不确定确切的问题是什么。有关字符串文字的具体细节,请参阅 C99 标准的第 6.4.5 节。 也许this *** question 可能会有所帮助,或者this one。 您已经知道修改字符串文字是 UB,幸运的是,当您尝试这样做时会遇到段错误。 GDB 显示当您修改它时会出现段错误。这里有什么问题? 好的,所以从技术上讲,char *a = "string1"; 应该生成一个关于使用const char * 值初始化char * 的编译器警告。我猜它没有的唯一原因是因为太多的遗留代码会开始抛出警告。 【参考方案1】:

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

那你怎么会出现分段错误呢? - 要点是char *ptr = "string literal" 使ptr 指向存储字符串文字的只读内存。所以当你尝试访问这个内存时:ptr[0] = 'X'(顺便说一下,相当于*(ptr + 0) = 'X'),这是一个内存访问冲突

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

看看Literal string initializer for a character array

【讨论】:

我只是想了解更多细节。有些线程让我感到困惑,char a[] = "sdsf"; 也是一个字符串文字。 @rjayavrp: “字符串文字是由双引号括起来的字符序列”。是的,在char a[] = "sdsf"; 中,"sdsf" 是一个字符串字面量,用于初始化数组a 谢谢。所以我误解了字符串文字是在只读部分分配内存的字符串。它不是基于内存位置:)。 @rjayavrp:“字符串文字”只是一些术语。要点是您检索存储字符串文字的只读内存地址(char *ptr = "string literal"),然后尝试访问此内存:*(ptr + 1) = 'A'... @moonman239:因为const char myyear = "2014"const char *myyear = "2014" 是不同的东西。

以上是关于字符串文字:指针与字符数组的主要内容,如果未能解决你的问题,请参考以下文章

使用指针算术修改字符串文字或字符数组[重复]

字符串数组与字符指针的区别

字符数组与字符指针

字符指针与字符数组

转:字符数组与字符指针

第6章 数组指针与字符串指针与数组