Отмена ссылки на указатель, переданный из другой функции в main()

Я пытаюсь использовать отдельную функцию для ввода данных с помощью 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 так, как будто он возвращает значение, но на самом деле изменяет переменную так, как я действительно хочу.

Спасибо еще раз за помощь!


person UvrD    schedule 28.02.2013    source источник


Ответы (3)


Эта функция:

void set_Info(void)
{
    int scanNum;
    scanf("%d", &scanNum);
}

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

И тело вашего main:

int scanNum = 0;
set_Info();

printf("%d", &scanNum);

определяет локальную переменную с именем scanNum, затем вызывает функцию set_Info(), которая никак не влияет на scanNum, определенную в main, а затем печатает адрес переменной scanNum.


Это то, что вы пытаетесь сделать:

void set_Info(int* num)
{
    // read an integer and store it into int that num points to:
    scanf("%d", num);
}

int main()
{
    int scanNum = 0;
    // pass the address of scanNum to set_Info function so that
    // changes to scanNum are visible in the body of main as well:
    set_Info(&scanNum);
    printf("%d", scanNum);
    return 0;
}

Я также рекомендую вам потратить больше времени на чтение какой-нибудь книги по основам C, прежде чем вы продолжите программировать :)

person LihO    schedule 28.02.2013
comment
Мне определенно нужно закрепить свои знания C, никаких аргументов! В настоящее время я новичок в программировании, и я поражен тем, сколько Java позволяет мне уйти по сравнению с C! (или, по крайней мере, насколько я понимаю) Спасибо за понимание, я понимаю, что делаю неправильно - person UvrD; 01.03.2013

Я бы передал переменную в вашу функцию set_Info, чтобы она знала, где сохранять данные. Это позволит вам сканировать несколько значений, и вы просто увеличите указатель. Обязательно передайте адрес переменной в set_Info(), используя &variableName, так как эта функция ожидает указатель

#include <stdio.h>
void set_Info(int *pScanNum);

int main()
{
    int scanNum = 0;
    set_Info(&scanNum);

    printf("%d", scanNum);
    return 0;
}


//Pass in the pointer to scanNum
void set_Info(int *pScanNum)
{
    printf("Scan test, enter a number");
    scanf("%d",pScanNum);
}
person cwhelms    schedule 28.02.2013

Избавьтесь от амперсанда! Printf хочет целое число, а не указатель.

printf("%d", scanNum);

И, как сказал liho, вам нужно вернуть scanNum из set_info, чтобы вы могли получить его вне функции.

int scanNum = set_Info();
person c.fogelklou    schedule 28.02.2013