Сегфоут происходит, потому что, когда вы передаете v
в vector_init
по значению, происходит то, что функция на самом деле получает копию v
, а не v
.
Это означает, что vector_init
на самом деле не инициализирует v
, а скорее инициализирует свою собственную копию v
(которая, кстати, уничтожается при завершении функции, что приводит к утечке памяти).
Поскольку v
неинициализирован, read_and_sum
работает с ним, но поскольку он пытается получить доступ к элементам также неинициализированного v.elem
(который к тому времени указывает на очень вероятную запрещенную часть памяти), программа падает, и вы получаете ошибку сегментации.
Решение, очевидно, передается по ссылке (или указателю, если вы хотите), тогда vector_init
может фактически инициализировать v
, который вы передаете ему, следовательно, все работает нормально.
В качестве примечания, я считаю, что должна быть реализована функция destroy_vector
, которая вызывает delete[] v.elem
, поэтому, когда вы закончите с v
, вы можете освободить память. Или, на что указывает v.elem
, что касается того, как сейчас, там определенно происходит утечка памяти.