Цитата(Палыч @ Jan 27 2012, 15:14)

Здесь - иное. Например, массив типа int нельзя создать с числом элементов больше чем 16383, для float - 8191...
Всё правильно, здесь именно «это». Максимальный
размер массива —
INT_MAX байтов.
Максимальное число элементов типа T —
INT_MAX / sizeof(T)Причина: в языке C разница двух указателей имеет тип
int (именно знаковая) и допустима для любых двух (под)элементов одного агрегата (включая элемент сразу за последним элементом массива). Учитывая возможность приведения к
char*.
Вот и получается, что раз разница двух приведённых к
char* указателей должна влазить в
int, то и размер (в смысле
sizeof() — размера объекта) любого агрегата — массива или структуры — не может превышать
INT_MAX.
Всё остальное — расширения языка.
Цитата(Сергей Борщ @ Jan 27 2012, 14:52)

Вы можете сделать структуру из нескольких массивов
Нельзя.
Код
struct {
char a[XXX];
char b[YYY];
} foo;
ptrdiff_t d1 = &foo.b[YYY] - &foo.a[0];
ptrdiff_t d2 = &foo.a[0] - &foo.b[YYY];
Для того, чтобы можно было получить обе разности, должно быть
sizeof(foo) <= INT_MAXupd:
Тьху, это уже (ещё) привычка равенства размера указателя и int работает.
Строго говоря, не
int, а таки
ptrdiff_t, так что на x86_64 можно и больше, чем INT_MAX, там
sizeof(int) = 4 а
sizeof(void*) = 8Так что вполне может быть «модель памяти» для 8- или 16-битной архитектуры, у которой указатель по умолчанию 24-или-более-битный и объект может занимать больше INT_MAX. С такими вещами сталкивался, но никогда не пользовался ввиду неэффективности и поэтому забыл.
В большинстве случаев таки упор в INT_MAX.