Передача по ссылке структуры в процедуры или функции - C (СИ)
Формулировка задачи:
Правильно ли передавать структуру по ссылке так.
из процедуры BigNum_add вызывается процедура BigNum_sub(bn1,bn2);
которая внутри себя изменяет bn1.Параметр bn1 изменяется как внутри
BigNum_add так и в BigNum_sub.
Cледовало бы ожидать что измененное значение передастся в вызывающую
процедуру BigNum_add и еще выше в вызывающую BigNum_addфункцию
Но этого не происходит. Отладчик показывает что
typedef struct BigNum { int sign; // Знак числа, 1 или -1. int *data; size_t size; } BigNum; void BigNum_add(BigNum * bn1, BigNum * bn2) { if (bn1->sign==bn2->sign) { ..... } else { .... BigNum_sub(bn1,bn2); .... }; } void BigNum_sub(BigNum * bn1, BigNum * bn2) { ......... }
вычисленное внутри BigNum_sub значение bn1 портится
. Хотя в варианте кодв с одноуровневым вызовом (т.е. когда в коде BigNum_add нет вызова процедуры BigNum_sub(bn1,bn2); в самый верх измененный в BigNum_add параметр bn1 отдично передается.Почему?
Решение задачи: «Передача по ссылке структуры в процедуры или функции»
textual
Листинг программы
int main(void) { int ia=15; printf("main::isx ia=%d\n", ia);// Старое значения foo(&ia); // Попытка изменить значение printf("main::izm ia=%d\n", ia); // стало новое знач system("pause"); return 0; }
Объяснение кода листинга программы
- int main(void) - функция main, тип возвращаемого значения - int, режим вызова функции - void.
- int ia=15; - объявление переменной ia типа int со значением 15.
- printf(
main::isx ia=%d\n
, ia); - вывод значения переменной ia в консоль. - foo(&ia); - вызов функции foo с передачей адреса переменной ia в качестве аргумента.
- printf(
main::izm ia=%d\n
, ia); - вывод нового значения переменной ia в консоль. - system(
pause
); - приостановка выполнения программы до нажатия клавиши. - return 0; - завершение работы функции main.
- foo(ia); - передача значения переменной ia в функцию foo.
- printf(
foo::isx ia=%d\n
, ia); - вывод значения переменной ia в консоль. - ia=20; - присвоение переменной ia новое значение.
- printf(
foo::izm ia=%d\n
, ia); - вывод нового значения переменной ia в консоль. - return ia; - возврат значения переменной ia из функции foo.
- printf(
main::isx ia=%d\n
, ia); - вывод значения переменной ia в консоль. - printf(
foo::isx ia=%d\n
, ia); - вывод значения переменной ia в консоль. - printf(
foo::izm ia=%d\n
, ia); - вывод нового значения переменной ia в консоль. - system(
pause
); - приостановка выполнения программы до нажатия клавиши. - return 0; - завершение работы функции main.
- int main(void) - функция main, тип возвращаемого значения - int, режим вызова функции - void.
- int ia=15; - объявление переменной ia типа int со значением 15.
- printf(
main::isx ia=%d\n
, ia); - вывод значения переменной ia в консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д