我正在读这本书http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html,我停下了其中一个例子。在我看来这是不正确的。我认为,没有不确定的行为。我错了吗?在这里它是:误解代码示例
隔空类型的数据对象,它是不常量和 的将其放入一个指向同一 类型的常量限定版本的地址是既安全又明确允许;你将能够使用 指针来检查对象,但不能修改它。把 一个const类型的地址放到一个指向非限定类型的指针上会更危险,因此被禁止(尽管你可以通过使用强制类型来得到 )。下面是一个例子:
#include <stdio.h>
#include <stdlib.h>
main(){
int i;
const int ci = 123;
/* declare a pointer to a const.. */
const int *cpi;
/* ordinary pointer to a non-const */
int *ncpi;
cpi = &ci;
ncpi = &i;
/*
* this is allowed
*/
cpi = ncpi;
/*
* this needs a cast
* because it is usually a big mistake,
* see what it permits below.
*/
ncpi = (int *)cpi;
/*
* now to get undefined behaviour...
* modify a const through a pointer
*/
*ncpi = 0;
exit(EXIT_SUCCESS);
}
例8.3 如示例所示,也可以取为恒定的对象的地址,>生成的指针 到非恒定,然后使用新指针。这是您的 程序中的错误,并导致未定义的行为。
在此示例中,ncpi
最终指向i
而不是ci
。所以我认为这使得这个例子不正确—在通过指针修改非const
变量时没有未定义的行为。你同意吗?
你为什么会认为修改一个常量不是未定义的东西? –
我不知道。因为在这个例子中ncpi最后指向了我的位置,没有ci。所以我认为这使得这个例子不正确。你同意吗? –
请注意,如果你的问题提示“如果你的问题是”ncpi“最终指向”i“,而不是”ci“,那么你的问题会得到更好的回答,而且没有人会拖延错误路径。所以我认为这就是这个例子不正确,你同意吗?“ –