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を指定すると、main()のprintfステートメントの結果は次のようになります。
2665560
さて、私が出力がメモリアドレスのように見えることを私が知ることができる限り、それを修正するために私が試みたのは、次のようにメインのポインタを逆参照することです:
int scanNum = 0;
int scanNumHolder;
set_Info();
scanNumHolder = *scanNum;
printf("%d", &scanNumHolder);
このコードは、scanNum
変数を逆参照された値のに割り当てられるようにするものだと思いますscanNum
。ただし、これを行うと、上記と同じ出力が得られます。それは私に2つのことのうちの1つを信じさせる。私が正しく逆参照scanNum
していないかscanNum
、この状況では実際にはまったくポインタではありません。
コンパイラから受け取る最も一般的なエラーは次のとおりです。
error: invalid type argument of unary ‘*’ (have ‘int’)
int
値をポインタとして処理しようとしているのであれば、これは理にかなっていると思います。
正しく逆参照されていない場合scanNum
、どうすればこれを達成できますか?
お手伝いありがとう
*アップデート
助けてくれてありがとう。
要約すると
set_info関数にアドレスパラメータを渡す必要があります。アドレスパラメータを使用する必要がある理由は、関数呼び出しの終了後に関数のローカルメモリが消去されるためです。したがって、main関数で宣言された変数を機能させるために、関数が終了したときに変更が失われないように、問題の変数のアドレスを渡します。
main関数内で、引数として&scanNumを指定してset_infoを呼び出すと、変数の参照tpが渡されるため、関数内のscanfステートメントによって生成された値を割り当てることができます。
SOのすばらしい人々によって正しく指摘されたように、私が間違っていたことは、値を返すようにset_infoを呼び出そうとしているが、実際には実際に必要なように変数を変更していることです。
助けてくれてありがとう!