相关疑难解决方法(0)

是否定义了减去两个NULL指针的行为?

是否定义了两个非void指针变量(根据C99和/或C++ 98)的差异NULL

例如,假设我有一个如下所示的缓冲区结构:

struct buf {
  char *buf;
  char *pwrite;
  char *pread;
} ex;
Run Code Online (Sandbox Code Playgroud)

比如说,ex.buf指向一个数组或一些malloc的内存.如果我的代码始终保证pwritepread点阵列中或一个过去,然后我相当有信心,ex.pwrite - ex.pread总是被定义.但是,如果pwritepread都是NULL.我可以只期望减去两个定义为(ptrdiff_t)0或严格兼容的代码需要测试指针为NULL吗?请注意,我感兴趣的唯一情况是两个指针都是NULL(表示缓冲区未初始化的情况).原因在于满足前面的假设,完全符合"可用"功能:

size_t buf_avail(const struct s_buf *b)
{     
    return b->pwrite - b->pread;
}
Run Code Online (Sandbox Code Playgroud)

c c++ c99 c89

75
推荐指数
3
解决办法
2918
查看次数

实现带有与 STL 容器一起使用的精美指针的分配器有哪些要求?

我正在尝试实现一个分配器,它允许我使用带有 STL 类型的boost::interprocess::offset_ptr的“花哨”指针

\n

作为一个独立的模板,指针本身工作得很好,但我很难让它与std::vectorboost::containers::vector

\n

我为指针实现的事情列表是:

\n
template<class T>\nclass OffsetPtr ...\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 来自 T*、T& 的构造函数
  • \n
  • 比较 <=、<、!=、==、>=、>=
  • \n
  • 解引用运算符* & 运算符->
  • \n
  • 任务
  • \n
  • 指针算术 ++、--、-、+、+=、-=
  • \n
  • 显式运算符 bool () const;
  • \n
  • 布尔运算符!() 常量;
  • \n
  • 使用 iterator_category = std::random_access_iterator_tag;
  • \n
  • 从 OffsetPtr(T) -> OffsetPtr(const T) 转换
  • \n
  • 重新绑定从 OffsetPtr(T) 到 OffsetPtr(U) 的转换
  • \n
  • 移动语义 - 尽管我认为这种类型实际上应该是不可移动的。
  • \n
  • 指针特征
  • \n
  • 随机访问迭代器要求
  • \n
  • 迭代器特征
  • \n
  • 原始指针和我的奇特指针之间的转换
  • \n
  • 与 nullptr 和 nullptr_t 的比较和转换
  • \n …

c++ templates allocator fancy-pointers

7
推荐指数
1
解决办法
480
查看次数

减去两个nullptr值保证为零?

是否由C++标准保证,如果我有两个相同类型的指针,其值等于nullptr,那些指针之间的差异等于0?

在伪数学符号中,以下谓词是否成立?

ForAll x ForAll y(x == nullptr)^(y == nullptr) - >(x - y == 0)

我能想到的最简单的代码示例:

int* x = nullptr;
int* y = nullptr;
assert(x - y == 0);
Run Code Online (Sandbox Code Playgroud)

我想这可以归结为:是否有可能有一个有效的C++标准实现,其中有多个位表示nullptr只能比较为相等,因为相等运算符做了一些魔术?

c++ c++11

5
推荐指数
1
解决办法
458
查看次数

三个问题:NULL - NULL 定义了吗?是否已定义 (uintptr_t)NULL - (uintptr_t)NULL?

  1. NULL - NULL定义为。?

  2. (char *)NULL - (char *)NULL定义为。?

  3. (uintptr_t)NULL - (uintptr_t)NULL定义为?

我知道它适用于我使用的所有实现。但从标准的角度来看,它是什么样子的呢?我找不到明确的答案。

编辑:从骗子看来,我认为问题的一个答案是:是的。

那么第二个问题和第三个问题呢?

c pointer-arithmetic null-pointer language-lawyer

3
推荐指数
1
解决办法
273
查看次数