首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >误读代码示例

误读代码示例
EN

Stack Overflow用户
提问于 2015-05-01 23:45:27
回答 1查看 111关注 0票数 3

我正在读这本书,volatile.html,我停下来看其中一个例子。我认为这是不正确的。我认为,没有不明确的行为。我说错了吗?下面是:

获取非const类型的数据对象的地址,并将其放入指向同一类型的const限定版本的指针中是安全的,并且是明确允许的;您将能够使用该指针检查该对象,但不能修改它。将const类型的地址放入指向不合格类型的指针中要危险得多,因此是禁止的(尽管您可以使用强制转换来解决这个问题)。下面是一个示例:

代码语言:javascript
复制
#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变量时没有未定义的行为。你同意吗?

EN

回答 1

Stack Overflow用户

发布于 2015-05-01 23:55:31

我同意:这是一个有缺陷的例子。代码本身显示了定义的行为。

最后赋值*ncpi = 0;之前的注释与代码不一致。也许作者打算做些不同的事情。

我的第一反应是,好像代码覆盖了一个const__:code -我修改了我的答案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29996692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档