Использование указателей для имитации передачи по ссылке с помощью простой функции, но без вывода

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

Использование указателей для имитации передачи по ссылке в функции передачи по значению (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;
}
*q = &x; UB здесь. Это должен быть q = &x;, возможно, вам даже не нужен int *q, вы можете напрямую вызвать, как cube1(&x)
kiran Biradar 03.10.2018 18:51
cube1 ожидает int * в качестве аргумента, вы передаете int. Но я думаю, что эта строка приведет к неопределенному поведению, если вы вызовете ее с помощью cube1(&x).
Osiris 03.10.2018 18:55

@kiranBiradar спасибо за предложение, которое, похоже, помогает.

Trixie the Cat 03.10.2018 19:10

@Osir - интересный момент, возможно, вы правы, но я думаю, что из-за простоты этой программы мне кажется, что я могу обойтись без вызова cube1 (& x) и все равно получить правильный результат. Однако ваше предложение по-прежнему ценно для меня как студента. Спасибо

Trixie the Cat 03.10.2018 19:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме