Sizeof() массива со случайной длиной
Можете ли вы объяснить, как sizeof()
работает с массивом случайной длины? Я думал, что sizeof()
в массиве вычисляется во время компиляции, однако размер массива со случайной длиной, кажется, вычисляется правильно.
Пример:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(){
srand ( (unsigned)time ( NULL ) );
int r = rand()%10;
int arr[r]; //array with random length
printf("r = %d size = %d\n",r, sizeof(arr)); //print the random number, array size
return 0;
}
Результат нескольких запусков:
r = 8 size = 32
r = 6 size = 24
r = 1 size = 4
Компилятор: gcc 4.4.3
Ответы
Ответ 1
В C99 sizeof массивы с переменным размером вычисляются во время выполнения. Из проекта C99 6.5.3.4/2:
Оператор sizeof дает размер (в байтах) своего операнда, который может быть выражением или именем в скобках типа. Размер определяется по типу операнда. Результат - целое число. Если тип операнда - тип массива переменной длины, операнд оценивается; в противном случае операнд не оценивается, а результат - целочисленная константа
Ответ 2
В вашем коде arr
- это особый тип массива: VLA (массив переменной длины).
В параграфе для sizeof стандарта (6.5.3.4) говорится:
Если тип операнда - это тип массива переменной длины, операнд оценивается
поэтому это не константа времени компиляции.
Ответ 3
В C99 компилятор достаточно умен, чтобы знать, что во время выполнения вызывается rand()
.
Ответ 4
При использовании sizeof
с VLA (массивами переменной длины), представленными на C99, их размер оценивается во время выполнения, а не времени компиляции.
См. очень приятную ссылку на эту тему здесь