Зачем рассчитывать размер?
Определите константу, содержащую размер, и используйте ее при объявлении массива. Ссылайтесь на константу всякий раз, когда вам нужен размер массива.
Будучи в первую очередь программистом C ++, я скажу, что исторически константа часто определялась как значение enum или #define. В C это может быть скорее текущим, чем историческим - я не знаю, как текущий C обрабатывает «const».
Если вы действительно хотите рассчитать размер, определите макрос для этого. Может быть даже стандартный.
Причина segfault наиболее вероятна, потому что массив, который вы пытаетесь объявить, имеет размер около 40 мегабайт и объявлен как локальная переменная. Большинство операционных систем ограничивают размер стека. Держите ваш массив в куче или в глобальной памяти, и 40 мегабайт для одной переменной, вероятно, подойдут для большинства систем, хотя некоторые встроенные системы могут все еще плакать. В языке, подобном Java, все объекты находятся в куче, и в стеке хранятся только ссылки. Это простая и гибкая система, но зачастую гораздо менее эффективная, чем хранение данных в стеке (издержки на выделение кучи, предотвращаемая фрагментация кучи, накладные расходы на косвенный доступ ...).