Почему арифметика пустого указателя c допускается в g cc? - PullRequest
4 голосов
/ 06 февраля 2020

Следующий код компилируется с использованием g cc, хотя void ptr arithmeti c не является стандартным:

int main(){
 int a = 5;
 void* b = (void*) &a;
 b++;
}

Ответы [ 2 ]

5 голосов
/ 07 февраля 2020

Это расширение поддерживается G CC. Он обрабатывает void * как char *.

Из g cc документов :

6.24 Арифмети c вкл void - и указатели на функции

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

Следствием этого является то, что sizeof также разрешен для void и для типов функций и возвращает 1.

0 голосов
/ 07 февраля 2020

Это объясняется тем, что изначально в C не было типа void. Вместо этого свою роль сыграл тип char. И sizeof( char ) равно 1.

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

memset( ( char * )p, 0, n );

, где аргумент p имеет тип int *.

Похоже, это было сделано для обратной совместимости.

...