вспомогательная функция с использованием указателей - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь реализовать вспомогательную функцию, которая суммирует целые числа в данном массиве, а затем изменяю переменную "array_sum" в основной функции с помощью указателей NOT RETURNING INT IN HELPER FUNCTION.Тем не менее, я получаю следующее сообщение об ошибке «Ошибка сегментации (ядро сброшено)», любая помощь будет очень признательна

void get_sum(int array[], int* array_sum)
{
    int length = sizeof(array)-1;
    int i = 0;
    for(i=0;i<length;i++){      
        *array_sum+= array[i];
    }   
}
main()
{
  int array_sum;
  int my_array[] = {25, 18, 6, 47, 2, 73, 100};

  get_sum(my_array, array_sum);

  printf("sum = %d", array_sum);

}

Ожидаемый результат:

сумма = 271

фактическаярезультат:

Ошибка сегментации (ядро сброшено)

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Функция 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);
0 голосов
/ 16 февраля 2019

Распад массива на указатель на его первый элемент при передаче в качестве аргумента функции, в вашем случае

sizeof(array) = sizeof(int*) = 8

, но я думаю, что ошибка сегментации не из той строки, поскольку случается, что my_array имеетровно 7 элементов, и длина, вычисленная в функции get_sum, также (совпадение) 7. Прежде всего вам нужно инициализировать array_sum и заменить строку

get_sum(my_array, array_sum);

на

get_sum(my_array, &array_sum);
0 голосов
/ 16 февраля 2019

Вы передаете array_sum по значению, когда функция ожидает свой адрес.Ошибка сегментации возникает из-за того, что строки в функции, где вы разыменовываете array_sum, будут пытаться обработать его значение как адрес памяти.

Кроме того, когда массив передается в качестве аргумента функции, он превращается в указатель на свой первый элемент, теряя информацию о длине.sizeof не даст вам длину массива в этом случае.

Вы можете либо передать в функцию параметр «length», либо использовать значение Sentinel в конце массива для указания функциикогда остановить обработку массива.Первый вариант - наименее хлопот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...