互联网的好人!
在我的新蜜蜂穿越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;
}
在这段代码中,heap
是int
s的数组,MANY
是整数文字的宏,整个思想是存储heap
in的某个元素的索引element
(或检查它是否已存在)。_set
并_element
假定是指向heap
的元素的指针。
问题是-他们为什么能先说一个_element
指向const的点,然后创建一个指向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
限定符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句