Указатели и их значения в C - PullRequest
0 голосов
/ 18 октября 2018

хорошо, поэтому часть этой программы, которую я должен создать, это в основном игра, в которой создается секретное число, и пользователь должен попытаться его угадать, и у меня возникли некоторые проблемы с его аспектом, связанным с указателями.В моей функции «generate_secret_number» у меня нет проблем с печатью значения указателя, но в моей функции «imTry», когда я вызываю функцию generate_secret_number и пытаюсь распечатать значение указателя, я продолжаю получать сообщение об ошибке «cygwin_exception»:: open_stackdumpfile: «Я надеялся, что кто-нибудь может дать мне некоторое представление о том, что я делаю неправильно, большое спасибо!

void generate_secret_number(int *a, int *b, int *c)
{
    int num1,num2,num3;

    num1 = (rand() % 5) + 1;
    num2 = (rand() % 6);
    num3 = (rand() % 6);

    a = &num1;
    b = &num2;
    c = &num3;

    printf("the secret number is: %d%d%d", *a,*b,*c);
}

void imTrying(int *a, int *b, int *c)
{
    int num1,num2,num3;
    generate_secret_number(a,b,c);
    printf("\n%d", *a);
}

Ответы [ 2 ]

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

В

foo(int *bar)
{
    bar = 0x42;
}

было бы бессмысленно (без каламбура) изменять значение бара.(Значением указателя является адрес, который он содержит).Поскольку указатель bar является копией адреса, по которому вызывается foo(), никто за пределами foo() никогда не заметит, что bar изменилось.

Вместо этого вам нужно сделать следующее:изменить объект bar очков тоже:

foo(int *bar)
{
    *bar = 42;
}
0 голосов
/ 19 октября 2018

вы берете адреса локальных переменных, чтобы хранить их в переменных локального указателя (вне зависимости от функции, оператор printf работает, что добавляет иллюзии)

a = &num1;
b = &num2;
c = &num3;

вместокопирования их значений в переменные, переданные по ссылке, надлежащим образом:

*a = num1;
*b = num2;
*c = num3;

(обратите внимание, что вы можете избежать использования num1 и т. д.), просто выполнив:

*a = (rand() % 5) + 1;
*b = (rand() % 6);
*c = (rand() % 6);

конечно, a, b и c должны указывать на действительную память при вызове функции.

int num1,num2,num3;
generate_secret_number(&num1,&num2,&num3);

Мы не видим вызывающеговызывающего абонента, но так как вы говорите:

Я получаю сообщение об ошибке «cygwin_exception :: open_stackdumpfile:»

это, вероятно, потому что вы звоните (вы не показываете) выглядит следующим образом:

int *a,*b,*c;
imTrying(a,b,c);

, поскольку адрес, указанный a, не инициализирован, , но не записан должным образом из-за вашей другой ошибки, программа вылетает с неопределенное поведение при попытке напечатать значение.

Чтобы исправить это, в вашем контексте:

void imTrying(int *a, int *b, int *c)
{
    // int num1,num2,num3;  // useless
    generate_secret_number(a,b,c);        
}

вызывающий абонент:

int num1,num2,num3;    // valid memory
imTrying(&num1,&num2,&num3);
printf("%d, %d, %d\n", num1,num2,num3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...