【问题标题】:const char* still modifies the pointed valueconst char* 仍然修改指向的值
【发布时间】:2015-09-22 13:56:36
【问题描述】:

为什么const char* 指向的值被一个字符数组更新,该数组应该只保存应该存储在 ROM 中的原始字符串文字的副本。

从这个链接const char * const versus const char *?知道const char*、char* const、const char* const的基本理论

#include <stdio.h>
#include <stdlib.h>

int main(){

    char a[] = "ABCD";
    char z[] = "WXYZ";
    const char* b = a;
    a[1] = 'N';  // WHY THIS WORKS AND UPDATES THE VALUE IN B.... a should make its own copy of ABCD and update
                 // it to NBCD... b should still point to a read only memory ABCD which can't be changed4

    //b[1] = 'N'; // THIS FAILS AS DESIRED
    printf("%s\n", b);   // Output -> ANCD

    return 0;
}

【问题讨论】:

  • 您的程序中没有数组的副本。赋值不会复制数组。

标签: c char constants


【解决方案1】:
const char* b = a;

const这里的意思是你不能修改指针通过b指向的东西,就是这样。通过a修改内容还是合法的。

【讨论】:

    【解决方案2】:

    您缺少了解的是什么是简单的指针。当你写

    const char* b = a;
    

    它说变量 b 指向变量 a 的相同内存位置。因此,您在 a 中所做的任何更改都会反映在 b 指向的内存中。

    【讨论】:

      【解决方案3】:

      您将b 设置为指向常量的指针,因此您不能使用b[...] 修改b 指向的值。但是您没有将a 设为常量指针,您可以修改a[] 的内容。

      变量b 保留您分配的内容。并且您分配了一个指向 a 数组的第一项的指针。现在b 指向存储a[0] 的相同内存位置。修改 a 数组内容后,您会看到 b 指向同一位置,现在包含修改后的数据。

      【讨论】:

        【解决方案4】:

        C 只禁止修改用 const 说明符定义的对象。您的对象a 未使用该说明符定义,因此可以对其进行修改。

        虽然确实不能通过b修改,但可以通过其他方式修改(如a)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-20
          • 1970-01-01
          • 2013-10-22
          • 2011-12-05
          • 2011-11-29
          • 1970-01-01
          相关资源
          最近更新 更多