You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中为何不能使用非const char*?数组与指针类型差异疑问

问题解答

1. 两种声明的本质差异

关于char foo[6] = "shock";

这是用字符串字面量初始化数组:

  • 编译器会为foo分配一块6字节的独立内存空间(栈上或全局/静态区,取决于声明位置)。
  • 把字符串"shock"的每个字符(包括末尾隐含的'\0')逐一拷贝到这块内存里。
  • 这块内存是可修改的,后续你可以通过foo[0] = 'S'这类操作修改数组内容,所以不需要加const修饰。

关于char* bar = "shock";

这是让指针指向字符串字面量:

  • 字符串字面量"shock"在C标准中属于只读数据,通常存储在程序的只读数据段(比如.rodata),不允许被修改。
  • 如果用非const的char*指向它,就意味着你可以通过bar[0] = 'S'去修改只读内存,这属于未定义行为(可能导致程序崩溃或异常结果)。
  • 现代编译器会强制要求声明为const char* bar,明确指针指向的内容不可修改,所以原代码会报错。

2. 数组名与指针的类型差异

虽然数组名在大多数场景下会退化为指向首元素的指针(比如传递给函数时,foo会被视为char*类型),但foo和bar的本质类型完全不同:

  • foo的类型是char[6](长度为6的char数组),它本身是一块连续的内存空间,直接持有数据。
  • bar的类型是char*(或const char*),它只是一个存储内存地址的变量,不持有数据,仅指向数据的存储位置。

用sizeof操作就能直观看出区别:sizeof(foo)返回6(数组的总字节数),而sizeof(bar)返回指针的字节数(比如4或8,取决于平台)。

内容的提问来源于stack exchange,提问作者TwistedBlizzard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:20:33