Массив указателей в функции не показывает правильные значения массива, используемого в вызове - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующая программа.

#include <stdio.h> 

double getAverage(int *arr[], int size) { 
    int i, sum = 0; 
    double avg; 

    for (i = 0; i < size; ++i) 
    { 
        printf("%d %d\n", i, arr[i]);
        sum = sum + arr[i]; 
    }    
    printf("%d\n", sum);
    avg = (double)sum / size; 
    return avg; 
}

int main () 
{ 
    /* an int array with 5 elements */ 
    int balance[5] = {1000, 2, 3, 17, 50}; 
    double avg; 
    /* pass pointer to the array as an argument */ 
    avg = getAverage( balance, 5 ) ; 
    /* output the returned value */ 
    printf("Average value is: %f\n", avg ); 
    return 0; 
} 

Вывод неправильный.Когда я печатаю значения * arr [], они не совпадают со значением баланса.Знаете ли вы, почему и как я могу исправить эту программу?

0 1000                                                                                                                                                         
1 3                                                                                                                                                            
2 50                                                                                                                                                           
3 0                                                                                                                                                            
4 0                                                                                                                                                            
256992                                                                                                                                                         
Average value is: 51398.400000  

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Ваша функция объявлена ​​как

double getAverage(int *arr[], int size)

То есть первый аргумент должен быть массивом указателей на int.

Затем выназовите его как

getAverage( balance, 5 )

, где balance - это массив int, который распадается на указатели на его первый элемент (т. е. balance равен &balance[0]).Это имеет тип int *.

Два типа не совпадают, о чем должен был предупредить компилятор.

Решение состоит в том, чтобы исправить аргумент функции:

double getAverage(int *arr, int size)
0 голосов
/ 29 ноября 2018

Проблема здесь:

double getAverage(int *arr[], int size) { 

Вы передаете указатель на массив.Это распадается на двойной указатель (int**).Вы используете его как int*, однако.В результате указатель арифметики под капотом неверен.Измените его следующим образом:

double getAverage(int arr[], int size) { 

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

Если ваш компилятор не выдавал никаких предупреждений для этого кода, попробуйте проверить, можете ли вы установить более строгие настройки для предупреждений.

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