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

C++中通过指针偏移修改char*字符串第二个字符未生效问题

代码不生效的核心原因

你的代码从地址计算、内存操作逻辑到基础认知存在3个关键错误,全程没有碰到你想修改的字符串第二个字符的内存位置:

  • 第一步地址计算就完全错了:name是一个char*类型的指针变量,本身是存在栈上的独立变量,它存储的值才是指向字符串首字符'e'的地址。&name取到的是指针变量name自身在栈上的地址,类型是char**,做&name + 1的指针运算时,偏移单位是一个char*的长度(64位系统下为8字节,32位下为4字节),最终得到的地址是栈上紧挨着name变量存储位置的一块栈内存,和字符串存储的内存区域完全无关。你往这个地址写值,改的是栈上的无关数据,根本没碰到字符串内容。
  • 你混淆了两个完全不同的地址概念:你想拿到字符串第二个字符'x'的地址,正确的偏移基准是name的值(也就是字符串首地址),正确写法是name + 1,而非&name + 1。
  • 对字符串常量的可修改性认知错误:你写的char *name = "example";中,等号右侧的"example"是存储在只读数据段的字符串常量,哪怕你把接收指针声明为非const的char*,修改只读段的内容也属于未定义行为,轻则程序崩溃,重则出现不可预期的结果。C++标准早已不允许将字符串常量直接赋值给非const的char*,正规写法需要加const限定:const char *name = "example";。如果需要可修改的字符串,应当将内容拷贝到可写内存,比如定义成栈上数组char name[] = "example";。

为什么代码运行没崩溃还输出了example

你写入(char*)'A'的位置是栈上name变量后方的未使用/无保护内存,写入操作既没有修改name指针本身存储的地址值,也没有触碰只读段里的字符串内容,因此name仍然指向原始的字符串常量example,输出自然和预期不符。另外你这里的强制类型转换也是无效的:你把字符'A'的ASCII值65强转为char*类型,本质是往目标地址写了一个值为0x41的指针值,根本不是写入字符'A',就算地址写对了也得不到你要的结果。

内容的提问来源于stack exchange,提问作者Vitor de oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:12:12