Функция get_sum
ожидает указатель на int
для второго параметра, но вместо этого вы передаете int
.Ваш компилятор должен был предупредить вас об этом.
В результате текущее значение array_sum
(которое является неопределенным, поскольку оно не было инициализировано) обрабатывается как значение указателя, которое ваша функция впоследствии разыменовывает.Разыменование недействительного указателя (а также чтение неинициализированного значения) вызывает неопределенное поведение , что в этом случае приводит к сбою.
Вам необходимо передать адрес изarray_sum
к функции.Это дает вам указатель на int
, который соответствует тому, что ожидает функция, так что вы можете изменить значение в функции.
get_sum(my_array, &array_sum);
Кроме того, следующее внутри get_sum
не относится к следующемуправильно:
int length = sizeof(array)-1;
Параметр array
на самом деле не массив, а указатель на первый элемент массива.Так что sizeof(array)
дает вам размер указателя.В этом конкретном случае это может сойти с рук, потому что, если в вашей системе указатель равен 8 байтам, length
устанавливается равным 7, что соответствует количеству элементов массива my_array
вmain
.Если вы добавили или удалили элементы, все внезапно сломалось бы.
Правильный способ справиться с этим - получить размер фактического массива в main
и передать его в вашу функцию.Таким образом, функция будет выглядеть так:
void get_sum(int array[], int* array_sum, int length)
И вы называете это так:
int my_array[] = {25, 18, 6, 47, 2, 73, 100};
int len = sizeof(my_array)/sizeof(my_array[0]);
get_sum(my_array, &array_sum, len);