我正在读这本书,volatile.html,我停下来看其中一个例子。我认为这是不正确的。我认为,没有不明确的行为。我说错了吗?下面是:
获取非const类型的数据对象的地址,并将其放入指向同一类型的const限定版本的指针中是安全的,并且是明确允许的;您将能够使用该指针检查该对象,但不能修改它。将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变量时没有未定义的行为。你同意吗?
发布于 2015-05-01 23:55:31
我同意:这是一个有缺陷的例子。代码本身显示了定义的行为。
最后赋值*ncpi = 0;之前的注释与代码不一致。也许作者打算做些不同的事情。
我的第一反应是,好像代码覆盖了一个const__:code -我修改了我的答案。
https://stackoverflow.com/questions/29996692
复制相似问题