Помимо возможности разыменовывать void**
, я не понимаю следующее:разница между ничтожной * и пустота **
void * foo, **bar;
foo++;//error
bar++;//no error
Почему не первая работа, но вторая делает? Какая разница?
Помимо возможности разыменовывать void**
, я не понимаю следующее:разница между ничтожной * и пустота **
void * foo, **bar;
foo++;//error
bar++;//no error
Почему не первая работа, но вторая делает? Какая разница?
Первый фрагмент
foo++;//error
потому, foo
является указателем на void
и вы не можете иметь арифметику указателей на void *
, размер void
типа не определен.
Второй фрагмент,
bar++;//no error
потому, bar
является указателем на указатель на void
. Таким образом, разрешена арифметическая операция, так как размер указателя на тип указателя четко определен.
FWIW, не удивляйтесь, если иногда, void pointer arithmetic "works" without any error.
Стоит отметить, что арифметика указателя, приводящая к адресам в нераспределенном пространстве, является UB. Поэтому 'bar ++' также небезопасен. –
@ EugeneSh.Да, мой вопрос специально для выделенных пространств, я постарался сделать мой вопрос как можно более минимальным. – shinzou
Можете ли вы ответить на другую часть моего вопроса? – shinzou
@juanchopanza Строго говоря, оба этих пошаговых приращения UB. –
@juanchopanza 'sizeof (void)' undefined, поэтому арифметика на указателях 'void' запрещена. – Quentin
@juanchopanza http://i.imgur.com/nnv2UGg.png – shinzou