Я сослался на следующий вопрос:
Использование указателей для имитации передачи по ссылке в функции передачи по значению (C и C++)
Я пытаюсь выполнить очень похожее упражнение, за исключением того, что вместо реализации функции «подкачки» я пытаюсь реализовать функцию, которая вычисляет куб целого числа. Меня озадачивает то, что я вообще не получаю вывода, даже тестового вывода "hello world". Фактически все, что я получаю, это следующее:
process exited after 1.967 seconds with return value 3221225477
Мой код выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
int cube1(int *p);
int cube2(int a);
int main(int argc, char *argv[])
{
int x;
int *q;
x = 3;
*q = &x;
//output test
printf("hello world\n");
printf( "x = %d\n", x );
printf( "q = %p\n", q );
printf("%d cubed using variable passing by reference = %d\n", x, cube1(x));
printf("%d cubed using variable passing by value = %d\n", x, cube2(x));
system("pause");
return 0;
}
//simulated pass by reference
int cube1(int *p)
{
int temp = *p;
temp = temp*temp*temp;
*p = temp;
return *p;
}
//standard pass by value
int cube2(int a)
{
return a*a*a;
}
cube1 ожидает int * в качестве аргумента, вы передаете int. Но я думаю, что эта строка приведет к неопределенному поведению, если вы вызовете ее с помощью cube1(&x).
@kiranBiradar спасибо за предложение, которое, похоже, помогает.
@Osir - интересный момент, возможно, вы правы, но я думаю, что из-за простоты этой программы мне кажется, что я могу обойтись без вызова cube1 (& x) и все равно получить правильный результат. Однако ваше предложение по-прежнему ценно для меня как студента. Спасибо





Если вы имитируете передачу по ссылке с помощью указателей, вам нужно передать указатель на функцию, а не на переменную. *q = &x; должен быть q = &x;, а вызов функции должен быть cube1(&x) или cube1(q).
Но даже если вы это сделаете, вы вызовете неопределенное поведение, поскольку вызываете cube1(&x), который изменяет x, и передаете x в качестве параметра без промежуточной точки последовательности. Гарантированного порядка оценки нет.
Например, в моей системе он выводит мне:
27 cubed using variable passing by reference = 27
27 cubed using variable passing by value = 19683
Чтобы избежать этого, вы должны вывести x и возвращаемое значение функции двумя отдельными операторами:
printf("%d cubed using variable passing by reference = ", x);
printf("%d\n", cube1(&x));
printf("%d cubed using variable passing by value = %d\n", x, cube2(x));
*q = &x;UB здесь. Это должен бытьq = &x;, возможно, вам даже не нуженint *q, вы можете напрямую вызвать, какcube1(&x)