微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c-将指向const int的指针转换为仅指向int的指针并对其进行修改

如何解决c-将指向const int的指针转换为仅指向int的指针并对其进行修改

互联网上的好人!

在遍及C的暴风雨大陆的新蜜蜂之旅中,我发现了这段代码

void * add (void * _set,const void *_element)
{   int * set = _set;
    const int * element =_element;
    assert(set > heap && set < heap +MANY);
    assert(* set ==MANY);
    assert(element >heap && element < heap +MANY);
    if (* element == MANY)
        * (int *) element = set — heap;
    else
        assert(* element == set —heap);
    return (void *)element;
}

在这代码中,heapint的数组,MANY是整数文字的宏,整个思想是存储一些索引heapelement的元素(或检查它是否已经存在)。假定_set_element是指向heap元素的指针。

问题是-他们怎么能首先说_element指向常量,然后创建一个新指针element指向const int,然后然后将其转换为常规int的指针,然后修改int?难道不是一些禁忌魔法吗?

长官,谢谢你!

干杯!

解决方法

如果使用const 定义了对象,则C标准未定义尝试对其进行修改的行为。

但是,如果没有定义了对象const,则可以指向该对象,将const添加到该指针,然后再删除const 。例如,以下行为具有明确的行为:

int x = 3;

// Fine,make a pointer to x:
int *p = &x;

// Copy into a `const int *`.
// Compiler accepts adding `const` without complaint:
const int *cp = p;

// Copy into an `int *` without `const`.
// Requires a cast because the compiler would complain without it:
int *np = (int *) cp;

// Change x,which was not defined with `const`.
*np = 4;

// Prints 4:
printf("%d\n",x);

使用此方案的情况是提供某些功能的库创建一个对象并希望客户端不要对其进行修改。因此,它为对象分配了空间,并为客户端提供了一个const限定的指向它的指针。 (尽管客户端可以通过使用强制转换来删除const来修改对象,如上所示,但值得一提的是-这种技术是防止无辜的错误,而不是防止故意的恶意。 )稍后,当库要修改或取消分配对象时,它可以使用从客户端收到的指针,并使用强制类型转换来删除const限定符。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。