#include <stdlib.h>
#include <stdio.h>
void roll_three(int* one, int* two, int* three)
{

  int x,y,z;
  x = rand()%6+1;
  y = rand()%6+1;
  z = rand()%6+1;

  one = &x;
  two = &y;
  three = &z;
  printf("%d %d %d\n", *one,*two,*three);  
}
int main()
{
  int seed;
  printf("Enter Seed: ");
  scanf("%d", &seed);
  srand(seed);
  int x,y,z;
  roll_three(&x,&y,&z);
  printf("pai: %d %d %d\n", x,y,z);
  if((x==y)&&(y==z))
    printf("%d %d %d Triple!\n",x,y,z);
  else if((x==y)||(y==z)||(x==z))
    printf("%d %d %d Double!\n",x,y,z);
  else
    printf("%d %d %d\n",x,y,z);
  return 0;

}

Это терминал, я набираю 123 для семени. Однако printf в roll_three и printf в основном дают разные результаты? Почему * one и x разные?

2
Hanslen Chen 27 Фев 2016 в 01:33

4 ответа

Лучший ответ

Проблема здесь:

one = &x;
two = &y;
three = &z;

Поскольку one, two и three являются указателями, вы изменили то, на что они указывают, но теперь они больше не указывают на main x, y и z. Это похоже на это ...

void foo(int input) {
    input = 6;
}

int num = 10;
foo(num);
printf("%d\n", num);  // it will be 10, not 6.

Вместо этого вы хотите изменить значение, хранящееся в памяти, на которую они указывают. Итак, разыменуйте их и присвойте им новое значение.

*one = x;
*two = y;
*three = z;

Вы даже можете исключить промежуточные значения.

*one   = rand()%6+1;
*two   = rand()%6+1;
*three = rand()%6+1;
6
Schwern 26 Фев 2016 в 22:47

Почему * one и x разные?

one = &x;

Должно быть

*one = x;

То, как вы это сделали (one = &x), неверно, потому что вы назначаете указатель one на адрес локальной переменной x, которая больше не существует после функции roll_three.

Ваша функция должна выглядеть так:

void roll_three(int* one, int* two, int* three)
{

    int x,y,z;
    x = rand()%6+1;
    y = rand()%6+1;
    z = rand()%6+1;

    *one = x;
    *two = y;
    *three = z;
    printf("%d %d %d\n", *one,*two,*three);  
}
1
artm 26 Фев 2016 в 22:39

В roll_three вам нужно изменить следующее:

one = &x;
two = &y;
three = &z;

Кому:

*one = x;
*two = y;
*three = z;

Первая версия просто указывает им на локальные переменные. Исправленная версия обновляет значения в вызывающей программе.

2
Tom Karzes 26 Фев 2016 в 22:37

В вашей функции roll_three

void roll_three(int* one, int* two, int* three)
{
  int x,y,z;
  x = rand()%6+1; // local variable x will have a value
  y = rand()%6+1;
  z = rand()%6+1;

  one = &x; // variable one is assigned with local variable x's address
            // so *one equals to x inside the function.
            // However, variable one supposed is the variable x's address in 
            // the main function, but now it is changed to the local x's address,
            // the main function variable x's value can't be updated as expected.
            // *one = x is the way you want to go.
  two = &y;
  three = &z;
  printf("%d %d %d\n", *one,*two,*three);  
}
0
Kaizhe Huang 26 Фев 2016 в 22:45