是否定义了两个非void指针变量(根据C99和/或C++ 98)的差异NULL?
例如,假设我有一个如下所示的缓冲区结构:
struct buf {
char *buf;
char *pwrite;
char *pread;
} ex;
Run Code Online (Sandbox Code Playgroud)
比如说,ex.buf指向一个数组或一些malloc的内存.如果我的代码始终保证pwrite和pread点阵列中或一个过去,然后我相当有信心,ex.pwrite - ex.pread总是被定义.但是,如果pwrite和pread都是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) 由于指针算术是在同一数组中定义的,我怀疑是否可以NULL从另一个数组中减去NULL。我担心的是:
//first and second can both either be from the same array
//or be both NULL
prtdiff_t sub(void *first, void *second){
//Do I really need this condition?
if(!first && !second)
return (ptrdiff_t) 0;
return second - first;
}
Run Code Online (Sandbox Code Playgroud)