sizeof () массива со случайной длиной - PullRequest
11 голосов
/ 17 августа 2011

Можете ли вы объяснить, как 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

Ответы [ 4 ]

13 голосов
/ 17 августа 2011

В C99 размер массивов переменного размера вычисляется во время выполнения.Из черновика C99 6.5.3.4/2:

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

3 голосов
/ 17 августа 2011

В вашем коде arr - это особый вид массива: это VLA (массив переменной длины).

Абзац для sizeof в Стандарте (6.5.3.4) гласит:

Если тип операнда является типом массива переменной длины, операнд оценивается

так это не постоянная времени компиляции .

2 голосов
/ 17 августа 2011

При использовании sizeof с VLA (массивами переменной длины), представленными в C99, их размер оценивается во время выполнения, а не во время компиляции.

См. Очень хороший справочник по теме здесь

2 голосов
/ 17 августа 2011

В C99 компилятор достаточно умен, чтобы знать, что rand() вызывается во время выполнения.

...