【问题标题】: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 这样的指针。

标签: arrays c pointers string-literals


【解决方案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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2012-09-29
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多