Как исправить передачу по ссылке, неправильно меняя значения - PullRequest
0 голосов
/ 30 января 2019

У меня есть функция, которая должна изменить значение, объявленное и определенное в main.Внутри функции аргумент передачи по ссылке должен увеличиваться при каждом сравнении.Функция объявлена ​​так:

int binSearch (int arr[], int size, int target, int * numComparisons) { ... 
    (*numComparisons)++; }

В рамках функции это выполняется.Однако после завершения функции значение numComparisons фактически не изменяется.Я написал выражение printf для вывода значения numComparisons на каждой итерации цикла, и оно работает должным образом (выводит 1, 2 и т. Д.), Однако после запуска функции переменная, переданная в качестве аргумента binSearch, остается назначение, которое я инициализировал.В чем моя проблема?
(в основном)

printf("%d, %d\n", binSearch(testArray, 100, 75, numCompAddress), numCompTest); 
// this returns the index and the incorrect value of numComparisons

Ответы [ 2 ]

0 голосов
/ 30 января 2019

При вызове printf("%d, %d\n", binSearch(testArray, 100, 75, numCompAddress), numCompTest); порядок вычисления подвыражений не определяется стандартом, который гласит:

3.4.4

1 неопределенное поведение

использование неопределенного значения или другое поведение, когда этот международный стандарт предоставляет две или более возможностей и не предъявляет никаких дополнительных требований к выбору в любом случае

2 ПРИМЕР Примером неуказанного поведения является порядок, в котором оцениваются аргументы функции.

Похоже, что в вашем случае значение второго аргумента numCompTest передается перед функциейназывается.Измените на:

printf("%d, ", binSearch(testArray, 100, 75, numCompAddress));
printf("%d\n", numCompTest);

и вы увидите, что хотите.

0 голосов
/ 30 января 2019

Я всегда буду меняться.Проблема в другом месте (в коде вы не показываете)

#include <stdio.h>

void foo(int *x)
{
    (*x)++;
}

int main(void) {
    int x = rand();
    printf("Before : %d\n", x);
    foo(&x);
    printf("After : %d\n", x);
    return 0;
}

https://ideone.com/B3zD47

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