【发布时间】:2011-12-29 00:21:05
【问题描述】:
如果两个非 void 指针变量都是 NULL 值,是否定义了它们的差异(根据 C99 和/或 C++98)?
例如,假设我有一个如下所示的缓冲区结构:
struct buf {
char *buf;
char *pwrite;
char *pread;
} ex;
说,ex.buf 指向一个数组或一些 malloc 的内存。如果我的代码始终确保 pwrite 和 pread 指向该数组内或超过它,那么我相当有信心 ex.pwrite - ex.pread 将始终被定义。但是,如果 pwrite 和 pread 都为 NULL 会怎样。我可以期望减去两者被定义为(ptrdiff_t)0 还是严格兼容的代码需要测试指针是否为 NULL?请注意,我感兴趣的唯一情况是 both 指针为 NULL(表示缓冲区未初始化的情况)。鉴于满足上述假设,原因与完全兼容的“可用”功能有关:
size_t buf_avail(const struct s_buf *b)
{
return b->pwrite - b->pread;
}
【问题讨论】:
-
您是否尝试过多次执行该操作?
-
什么意思?我知道这个操作的结果在 95%(假设 5% 是 AS/400)的实现中为 0,不会发生任何不好的事情。我对实现细节不感兴趣。我的问题与一些特定的标准定义有关。
-
Hunter McMillen:这是不好的方法——“我将指针存储在 int 中,但什么也没发生。我检查了不同的计算机和编译器,但什么也没发生。然后是 64 位计算机”。如果某些东西现在可以工作,但依赖于未定义的行为,那么它将来可能无法工作。
-
我赞扬您确保您的代码保证按照相关标准工作,而不是仅仅注意到它恰好在您测试的平台上工作。
-
@TobySpeight:8086 编译器对
near限定的空指针与far限定的空指针有不同的表示,但它会为空far指针使用多种表示吗?如果空near指针转换为far指针,则该指针又与空far指针进行比较,例如DS 等于 0x1234,会发生什么: (1) 0x0000 被转换为 0x0000:0x0000; (2) 0x0000 被转换为 0x1234:0x0000,但比较运算符检查双段为零的情况,或者 (3) 0x0000 被转换为 0x1234:0x0000,比较不等于 0x0000:0x0000。