Определено ли поведение вычитания двух указателей NULL?

Определена ли разница между двумя переменными указателя, не имеющими значения void (для C99 и / или C ++ 98), если они обе Значение NULL ?

Например, у меня есть структура буфера, которая выглядит так:

struct buf {
  char *buf;
  char *pwrite;
  char *pread;
} ex;

Скажем, ex.buf указывает на массив или некоторую нераспределенную память . Если мой код всегда гарантирует, что точка 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;
}
75
задан Destructor 19 October 2015 в 13:52
поделиться