Коду C нравится следующее:
#include <stdio.h>
#include <unistd.h>
#define DIM(a) (sizeof(a)/sizeof(a[0]))
struct obj
{
int a[1];
};
int main()
{
struct obj *p = NULL;
printf("%d\n",DIM(p->a));
return 0;
}
Этот указатель объекта p
равен NULL
, поэтому я думаю, что этот p->a
является незаконным.
Но я тестировал этот код в Ubuntu14.04, он может выполняться правильно. Итак, я хочу знать, почему...
Примечание: исходный код имел int a[0]
выше, но я изменил его на int a[1]
, поскольку все, кажется, зависли на этом, а не на самом деле, это:
Является ли выражение sizeof(p->a)
действительным, когда p
равно NULL
?