#include <stdio.h>
#include <stddef.h>

#define LENGTH(ARRAY) (sizeof(ARRAY)/sizeof((ARRAY)[0]))

#define arr(NAME, TYPE, ...) \
TYPE *NAME =\
((struct {\
	size_t n;\
	TYPE u[LENGTH(((TYPE []){__VA_ARGS__}))];\
}){\
	.n = LENGTH(((TYPE []){__VA_ARGS__})),\
	.u = {__VA_ARGS__}\
}).u

#define len(ARRAY) \
*(size_t *)(void *)((char *)&ARRAY[0]-offsetof(struct {size_t n; void *u;}, u))

struct xy {
	int x;
	int y;
};

static void print_array(struct xy *a)
{
	for (size_t i = 0; i < len(a); ++i) {
		printf("(%d, %d) ", a[i].x, a[i].y);
	}
	printf("\nThe size of this array is %zu\n", len(a));
	return;
}

int main(void)
{
	arr(points, struct xy, {12, 34}, {56, 78}, {11, 99});
	print_array(points);
	return 0;
}