2015-07-08 4 views
-5

Помимо возможности разыменовывать void**, я не понимаю следующее:разница между ничтожной * и пустота **

void * foo, **bar; 
foo++;//error 
bar++;//no error 

Почему не первая работа, но вторая делает? Какая разница?

+0

@juanchopanza Строго говоря, оба этих пошаговых приращения UB. –

+1

@juanchopanza 'sizeof (void)' undefined, поэтому арифметика на указателях 'void' запрещена. – Quentin

+0

@juanchopanza http://i.imgur.com/nnv2UGg.png – shinzou

ответ

8

Первый фрагмент

foo++;//error 

потому, foo является указателем на void и вы не можете иметь арифметику указателей на void *, размер void типа не определен.

Второй фрагмент,

bar++;//no error 

потому, bar является указателем на указатель на void. Таким образом, разрешена арифметическая операция, так как размер указателя на тип указателя четко определен.

FWIW, не удивляйтесь, если иногда, void pointer arithmetic "works" without any error.

+0

Стоит отметить, что арифметика указателя, приводящая к адресам в нераспределенном пространстве, является UB. Поэтому 'bar ++' также небезопасен. –

+0

@ EugeneSh.Да, мой вопрос специально для выделенных пространств, я постарался сделать мой вопрос как можно более минимальным. – shinzou

+0

Можете ли вы ответить на другую часть моего вопроса? – shinzou