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

C与C++字符指针差异:字符串常量赋值报错原因解析

C与C++中字符串字面量赋值的差异解析

问题场景

C语言中可正常编译运行的代码:

char* Test = (char*) malloc(sizeof(char));
Test = "Hey";

在C++中,相同代码会触发编译错误:

char* Test = (char*)malloc(sizeof(char));
Test = "Hey";

错误提示:

a value of type "const char *" cannot be assigned to an entity of type "char *"


核心差异:字符串字面量的类型定义

  • C语言里,字符串字面量(比如"Hey")的类型被视为char[],支持隐式转换为char*。这是历史兼容设计,但要注意:字符串字面量实际存在只读内存中,用char*指向后去修改它属于未定义行为——编译器不拦截,但运行时可能崩溃或出现异常。
  • C++对类型安全要求更严格,字符串字面量的类型是const char[],只能对应const char*指针。不允许把const char*直接赋值给char*,就是为了避免程序员误操作修改只读内存。

为什么C++会报错且不允许后续修改?

  1. 类型安全拦截:C从语法层面强制区分只读和可写内存的指针类型。字符串字面量是只读的,必须用const char*指向;如果允许赋值给char*,就相当于允许通过指针修改只读内存,这是C要杜绝的风险,所以直接编译报错。
  2. 底层存储本质:不管C还是C++,字符串字面量都存在程序的只读数据段(比如.rodata)。就算C语言允许你用char*指向它,尝试修改*Test = 'h'这种操作本身就是非法的,属于未定义行为。C++只是把这种潜在的运行时问题提前在编译阶段暴露出来,避免后续踩坑。

额外提醒

这段代码还有个严重问题:不管是C还是C++,malloc分配的1字节内存地址被Test = "Hey"覆盖后,这块内存再也无法被访问和释放,属于内存泄漏,实际开发中一定要避免这种写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:39:14