Как в этом случае работает sizeof? - PullRequest
7 голосов
/ 05 мая 2020

Посмотрите на следующий код:

#include <stdio.h>

int main(void) 
{
    int i = 1;
    printf("%lu\n", sizeof(int[++i]));
    printf("%d", i);
}

Я тестировал оператор sizeof, потому что вычисляются операнды типа массива переменной длины - Я был бы рад, если бы кто-нибудь прояснил это как ну, но вопрос в другом .

6.5.3.4 / 2

Оператор sizeof возвращает размер (в байтах) его операнда, который может быть выражением или именем в скобках типа. Размер определяется типом операнда. Результат - целое число. Если тип операнда является массивом переменной длины, операнд оценивается; в противном случае операнд не оценивается, и результатом является целочисленная константа .

Вывод приведенного выше кода на G CC выглядит следующим образом:

8
2

Может кто-нибудь объясните пожалуйста откуда эта 8? Превращается ли массив в указатель? Также дайте пояснения по части массива переменной длины.

Ответы [ 2 ]

4 голосов
/ 05 мая 2020

Во время вычисления int[++i], i изначально имеет значение 1. Таким образом, int[++i] оценивается как int[2], то есть массив int размером 2.

Предполагая, что int - это 4 байта в вашей системе, этот массив имеет размер 8 байтов.

4 голосов
/ 05 мая 2020

Длина int составляет 4 байта. Вы передаете оператору sizeof массив int длиной 2. Для хранения массива int 2 вам нужно 2x4 = 8 байтов.

++i

увеличивает значение i с 1 до 2 перед его использованием. Вот почему ваш результат равен 8 и 2.

...