Каков размер пустоты?

К чему привел бы этот оператор?

void *p = malloc(sizeof(void));

Править: Расширение вопроса.

Если sizeof (пусто) уступает 1 в компиляторе GCC, то 1 байт памяти выделяется, и указатель p указывает на тот байт и был бы p ++ увеличиваться к 0x2346? Предположим, что p был 0x2345. Я говорю о p и не *p.

73
задан plasmacel 23 October 2019 в 23:40
поделиться

7 ответов

Тип void не имеет размера; это было бы ошибкой компиляции. По той же причине вы не можете сделать что-то вроде:

void n;

EDIT. К моему удивлению, выполнение sizeof (void) на самом деле компилирует в GNU C:

$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc -w - && ./a.out 
1

Однако в C ++ этого не происходит:

$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc++ -w - && ./a.out 
<stdin>: In function 'int main()':
<stdin>:1: error: invalid application of 'sizeof' to a void type
<stdin>:1: error: 'printf' was not declared in this scope
52
ответ дан 24 November 2019 в 12:19
поделиться

В C, sizeof (void) == 1 в GCC, но это, похоже, зависит от вашего компилятора.

В C ++ я получаю:

In function 'int main()':
Line 2: error: invalid application of 'sizeof' to a void type
compilation terminated due to -Wfatal-errors.
3
ответ дан 24 November 2019 в 12:19
поделиться

Принятие размера пустоты - это расширение GCC .

10
ответ дан 24 November 2019 в 12:19
поделиться

Хотя void может стоять вместо типа, на самом деле он не может содержать значение. Следовательно, у него нет размера в памяти. Получение размера void не определено.

Указатель void - это просто языковая конструкция, означающая указатель на нетипизированную память.

15
ответ дан 24 November 2019 в 12:19
поделиться

sizeof () не может применяться к неполным типам. А void - неполный тип, который нельзя заполнить.

5
ответ дан 24 November 2019 в 12:19
поделиться

Если вы используете GCC и не используете флаги компиляции, удаляющие специфические расширения компилятора, то sizeof (void) равно 1. GCC имеет нестандартное расширение , который делает это.

В общем, void является неполным типом, и вы не можете использовать sizeof для неполных типов.

39
ответ дан 24 November 2019 в 12:19
поделиться

Ко второй части вопроса: Обратите внимание, что sizeof (void *)! = Sizeof (void). В 32-битной арке sizeof (void *) составляет 4 байта, поэтому p ++ будет установлен соответственно. Величина, на которую увеличивается указатель, зависит от данных, на которые он указывает. Таким образом, он будет увеличен на 1 байт.

0
ответ дан 24 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: