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
相关产品推荐
相关产品推荐

