Как происходит арифметика пустых указателей в GCC

int main()  
{  
    int a;  
    void *p;  
    p = &a;  
    printf("%ld\n",(long)p);  
    p = p+1;  
    printf("%ld\n",(long)p);  
}  

В этой программеp+1 просто увеличивает значение р на 1. Я знаю,void pointer arithmetic невозможно вC, такGCC делает это неявно. И если да, то принимает ли это какchar pointer, Кроме того, почемуdereferencing невозможно для пустого указателя, если он неявно выполняет арифметику указателя.

 Kerrek SB28 окт. 2012 г., 22:44
Что вы ожидаете от результата разыменования пустого указателя ?!
 Kerrek SB28 окт. 2012 г., 22:45
Кроме того, в чем вопрос? Вы уже заметили, что GCC реализует арифметику пустых указателей, такую как арифметика указателей на символы, так что именно неясно?
 neel28 окт. 2012 г., 22:44
это хороший вопрос

Ответы на вопрос(1)

Решение Вопроса

void * тип указателя

GNU C позволяет это, учитывая размерvoid является1.

Из6.23 Арифметика по пустым и функциональным указателям:

В GNU C операции сложения и вычитания поддерживаются для указателей на void и указателей на функции. Это сделано, рассматривая размер пустоты или функции как 1.

http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html

Теперь, чтобы ответить на этот вопрос:

Кроме того, почему разыменование невозможно для пустого указателя, если он неявно выполняет арифметику указателя.

GNU C допускает арифметику указателей сvoid * но все еще не позволяет объект типаvoid быть объявленным.

 RAM JI GUPTA28 окт. 2012 г., 23:05
Что касается GCC, когда мы пишем только * p, это утверждение удаляется как часть шага оптимизации. Так что на самом деле разыменование не происходит .. Если я напишу int x = * p; тогда это дает ошибку
 ouah29 окт. 2012 г., 00:03
Настоящая причина, почему вы не можете разыменоватьvoid * на самом деле включает в себя lvalues,void является неполным типом и lvalues не может иметь неполный тип.
 RAM JI GUPTA28 окт. 2012 г., 22:48
тогда почему разыменование не разрешено в GNU C?

Ваш ответ на вопрос