Я пытаюсь использовать отдельную функцию для ввода данных с помощью scanf()
(вне main
). Предполагается, что эта новая функция печатает строку, а затем получает ввод от пользователя. Однако, похоже, что-то идет не так между scanf
в функции и функцией printf()
в main
, с которой я ее тестирую.
Я считаю, что я получаю указатель от функции, но некоторые предупреждения компилятора заставляют меня задаться вопросом, правильно ли мое предположение об указателе.
Меня смущает вывод этого кода:
#include <stdio.h>
void set_Info(void);
int main()
{
int scanNum = 0;
set_Info();
printf("%d", &scanNum);
return 0;
}
void set_Info(void) /* start of function definition */
{
int scanNum;
printf("Scan test, enter a number");
scanf("%d",&scanNum);
}
Если я укажу число, скажем, 2, результатом оператора printf в main() будет:
2665560
Теперь, насколько я могу сказать, вывод выглядит для меня как адрес памяти, поэтому я попытался исправить это, разыменовав указатель в main следующим образом:
int scanNum = 0;
int scanNumHolder;
set_Info();
scanNumHolder = *scanNum;
printf("%d", &scanNumHolder);
Я считаю, что этот код делает переменную scanNum
присвоенной разыменованному значению scanNum
. Однако, когда я это делаю, я получаю тот же результат, что и выше. Что заставляет меня поверить в одно из двух. Либо я неправильно разыменовываю scanNum
, либо scanNum
вообще не является указателем в этой ситуации.
Самая распространенная ошибка, которую я получаю от компилятора:
error: invalid type argument of unary ‘*’ (have ‘int’)
Что, я полагаю, имеет смысл, если я пытаюсь рассматривать значение int
как указатель.
Если дело в том, что scanNum
неправильно разыменовывается, как я могу этого добиться?
Спасибо вам за помощь
*Обновить
Спасибо за помощь.
Просто резюмировать
Моей функции set_info нужно передать параметр адреса. Причина, по которой необходимо использовать адресный параметр, заключается в том, что локальная память функции стирается после завершения вызова функции. Итак, чтобы выполнить работу переменной, объявленной в основной функции, я передаю адрес рассматриваемой переменной, чтобы при завершении функции изменения не были потеряны.
Внутри основной функции, когда set_info вызывается с &scanNum в качестве аргумента, она передает ссылку на переменную, чтобы ей можно было присвоить значение, сгенерированное оператором scanf в функции.
Я понимаю, что я делал неправильно, как правильно указали замечательные люди из SO, так это то, что я пытаюсь вызвать set_info так, как будто он возвращает значение, но на самом деле изменяет переменную так, как я действительно хочу.
Спасибо еще раз за помощь!