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

Posted

技术标签:

【中文标题】使用指针算术修改字符串文字或字符数组[重复]【英文标题】:Modifying string literals or char arrays with pointer arithmetic [duplicate] 【发布时间】:2022-01-09 01:26:54 【问题描述】:

我知道char* pString 是只读的,因此pString[0]='A' 会给出分段错误,但为什么pString2[0]='A' 在下面的代码中工作:

    char* pString  = "abcdefg";
    char tmpStr[80];
    strcpy(tmpStr, pString);
    char* pString2  = tmpStr;

    //pString[0] = 'A'; // gives segmentation error since string literal is read-only.
    pString2[0] = 'A'; // why this one works? 
    

【问题讨论】:

pString2 指向(非常量)数组tmpStr 的第一个元素。您可以随意修改tmpStr 的内容,直接使用数组或通过像pString2 这样的指针。 【参考方案1】:

pString2 未指向字符串文字。它指向char 数组的第一个元素,而该数组不是const,因此允许写入。

【讨论】:

【参考方案2】:

在此声明中

char* pString  = "abcdefg";

字符串文字是记录"abcdefg",而不是声明的指针。

C 中的字符串文字的类型为char[8]。尽管在类型中没有限定符const,但是您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

在 C++ 中,与 C 字符串文字相对的是常量字符数组类型。

至于声明的指针则指向字符串字面量的第一个元素。

在这段代码中sn-p

char tmpStr[80];
strcpy(tmpStr, pString);

声明了字符数组tmpStr。您可以更改数组。

在此声明中

strcpy(tmpStr, pString);

字符串文字的元素被复制到字符数组中。

并且在声明下面声明的指针指向数组的第一个元素。

char* pString2  = tmpStr;

pString2[0] = 'A';

所以你可以改变数组。您甚至可以使用指针 pString 而不是 pString2 之类的

pString  = tmpStr;

pString[0] = 'A';

请注意,您可以使用字符串字面量初始化字符数组。所以你可以写例如

char tmpStr[] = "abcdefg";
*tmpStr = 'A';

tmpStr[0] = 'A';

【讨论】:

以上是关于使用指针算术修改字符串文字或字符数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

最小栈(栈设计)删除有序数组中的重复项(数组双指针)最大数(贪心字符串)

为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]

Part6 数组指针与字符串 6.6指针与数组

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

数组与文字处理

为啥修改指向字符串文字的指针的内容是错误的?