2 yiyi  baby yiyi__baby 于 2015.06.09 16:48 提问

关于const_cast的相关问题
const char *pc;
char *p =const_cast<char *> (pc);     //正确:但是通过p写值是未定义的行为

这里很奇怪,既然改变运算对象的底层const,不就是为了给它写值么,为什么反而是未定义的行为,感觉好多余。

2个回答

91program
91program   Ds   Rxr 2015.06.09 17:10
已采纳

pc 是 const,但 p 不是 const。
这就是 C 语言指针使用的问题:将指针指向一个 const 的对象,能修改数据,这时编译器不会认为是错误的。

yiyi__baby
yiyi__baby 回复91program: 就是这样没错,嘿嘿
2 年多之前 回复
91program
91program 回复yiyi__baby: 详细的说,是因 pc 在定义时未赋初值,而局部变量未赋初值时其值是随机的。但 pc 是 const 型无法修改,但通过 p 却可以修改,修改了哪里的数据呢?没有人知道,随机的。
2 年多之前 回复
91program
91program 回复yiyi__baby: 因为 p 指向随机,可能是指向到系统区,所以对其操作会引起未定义的行为的错误。
2 年多之前 回复
yiyi__baby
yiyi__baby 我知道这是合法的,为什么是未定义的,通过p修改对象的值后会产生未定义的行为,怎么解释(比如修改指针的地址超出范围是未定义的,类似这种)
2 年多之前 回复
liqiongfan
liqiongfan   2015.06.09 18:25

const char *pc = ""Hello;
char *p = const_cast(pc);


如果楼主的代码是说这样的话,下面可以帮助你理解为什么?
解释:你理解了const_cast<>强制类型转换的机制但是没有理解char *pc 与char pc[]的区别。
const char *pc;这句话将pc指向的是一个字符串常量,并且指针的类型也是const char类型;
经过char *p = const_cast(pc);后,char *p指向的内容同样也是字符串常量“Hello”,常量是不能更改的。
而如果改成下面的就行了:
const char pc[] = "Hello";
char *p = const_cast(pc);
p[0] = 'J';


yiyi__baby
yiyi__baby 不是哦,不过非常感谢
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片