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

Я ссылался на следующий вопрос:

Использование указателей для эмуляции передачи по ссылке в функции передачи по значению (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;
}

1 Ответ

0 голосов
/ 03 октября 2018

Если вы эмулируете передачу по ссылке с указателями, вы должны передать указатель на функцию, а не на переменную.*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));
...