特殊指针值的奇怪用法

时间:2018-11-13 00:15:47

标签: c++ pointers

我正在使用一种算法的C ++实现,这种算法会奇怪地使用特殊的指针值,我想知道它的安全性和可移植性。

首先,有一些结构包含一个指针字段。它通过用memset()将数组清零来初始化此类结构的数组。稍后,代码依靠以这种方式初始化的指针字段进行比较,以等于NULL;在NULL指针的内部表示形式不是全零的机器上会不会失败?

随后,代码将一些指针设置为特定的指针值,即((type*) 1)((type*) 2),并在以后比较等于其的某些指针。显然,这些指针是一些标志,不应取消引用。但是我可以确定某些真正有效的指针不会等于其中之一吗?有没有更好的方法(安全,可移植)(例如,使用只能由指针变量通过显式赋值才能获取的特定指针值,以标记特定情况)?

欢迎任何评论。

1 个答案:

答案 0 :(得分:0)

总结我收到的评论,问题中提出的两个问题的确可以在“常规”设置中使用,但不能保证。

现在,如果我要绝对保证,似乎最好的选择是,对于NULL指针,可以手动设置或使用适当的构造函数设置它们,对于特殊的指针值,可以手动创建 sentinel 指针值。

对于后者,我想在C ++类中,最优雅的解决方案是使用静态成员

class The_class
{
    static const type reserved;
    static const type* const sentinel;
};

提供了可以在某处初始化的信息

const type The_class::reserved = foo; // 'foo' is a constant expression of type 'type'
const type* const The_class::sentinel = &The_class::reserved;

如果将type用作模板,则必须为每个预期的type实例化上述初始化,或者必须诉诸非static(不太优雅,但仍然有用)“保留”和“前哨”成员。

template <typename type>
class The_class
{
    type reserved; // cannot be static anymore, nor const for complicated 'type' without adapted constructor
    const type* const sentinel;
public:
    The_class() : sentinel(&reserved);
};