sizeof
операнд будет оценивать операнд, если это массив переменной длины.
6.5.3.4, p2: если тип операнда представляет собой тип массива переменной длины, операнд оценивается;
Тем не менее, этот код работает, и я предполагаю, что он определен:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct test
{
struct test* t;
int i;
};
int main(void)
{
int r = ( rand() % 100 ) + 1;
assert( r > 0 );
struct test* a[r];
for( size_t i = 0; i < r; i++ )
{
a[i] = NULL;
}
printf("%zu\n" , sizeof( a[0]->i ) );
//printf("%d\n", a[0]->i ); //this will of course crash the program
return 0;
}
- Код определен?
- Вычисляется ли операнд
sizeof
? - Разве оценка не должна разыменовывать указатель?
- В чем разница между первым и вторым
printf
, учитывая контекст?
Программа кажется правильной при любом количестве дополнительных отступлений:
struct other
{
int i;
};
struct test
{
struct other* t;
};
int main(void)
{
int r = ( rand() % 100 ) + 1;
assert( r > 0 );
struct test* a[r];
for( size_t i = 0; i < r; i++ )
{
a[i] = NULL;
}
printf("%zu\n" , sizeof( a[0]->t->i ) );
//printf("%d\n", a[0]->t->i ); //this will of course crash the program
return 0;
}
int
. Нет? - person kaylum   schedule 19.08.2015sizeof(a)
, то оцениваетсяa[r]
. То есть нужно получить фактическое значениеr
. Но я не эксперт по языкам, поэтому, пожалуйста, поправьте, если это не то, что это означает. - person kaylum   schedule 19.08.2015