Указатель и printf () - PullRequest
       1

Указатель и printf ()

0 голосов
/ 30 апреля 2019

У меня следующий код C:

float *dv(int a, int b);

int main() {
  int x ,y;

  scanf("%d%d",&x,&y);
  float *pt;
  pt = dv(x,y);

  printf("The div is %f", pt);      
  return 0;
}

float *dv(int a, int b){
  float d;
  d = (float) a / b;
  return &d;
}

, и у меня есть несколько вопросов по этому поводу!Если я пропущу объявление / инициализацию указателя

pt = dv(x,y);

и запишу в printf ("div is% f", * dv (x, y));

, он будет воспроизводиться нормально!Но почему?Где моя ошибка ??

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

В вашем случае float d определяет локальную переменную с автоматическим хранением, поэтому время жизни заканчивается возвратом функции.

Вам нужна переменная, которая остается активной на протяжении всего использования, попробуйте изменить определение переменной, чтобы она стала статическим хранилищем (у которого есть время жизни в программе), как

static float d;

Тогда возвращаемый указатель будет действителен и в вызывающем абоненте.

Тем не менее, у вас несоответствие типов

 printf("The div is %f", pt);

должно быть

 printf("The div is %f", *pt);

когда вы пытаетесь напечатать float, а не float *.

2 голосов
/ 30 апреля 2019

Не усложняйте, когда это может быть просто:

float dv(int a, int b);

int main() {
  int x ,y;

  scanf("%d%d",&x,&y);
  float pt;
  pt = dv(x,y);

  printf("The div is %f", pt);      
  return 0;
}

float dv(int a, int b){
  float d;
  d = (float) a / b;
  return d;
}

Тебе вообще не нужны указатели.

Также прочитайте это: Как получить доступ к локальной переменной из другой функции с помощью указателей?

2 голосов
/ 30 апреля 2019

У вас неопределенное поведение в обоих случаях.

pt = dv(x,y);

или

printf("The div is %f", *dv(x,y));

Поскольку вы возвращаете адрес локальной переменной, который исчезнет, ​​когда управление достигнет конца функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...