「Understanding pointers in C」という本には、引数が説明された後に解決された問題がいくつかあります。22ページ、問題N.5 コードと解説を添付します。その後、私の質問があります。
#include <stdio.h>
int main()
{
int *c;
c = check(10, 20);
printf("c = %p\n",c);
return 0;
}
int * check(int i, int j)
{
int *p, *q;
p = &i;
q = &j;
if(i >= 45)
{
return p;
}
else
{
return q;
}
}
出力: エラー メッセージ: メインでの移植性のないポインター割り当て
説明 エラーの理由は簡単です。check( ) に渡される整数は i と j に集められ、それらのアドレスが p と q に割り当てられます。次に、次のステートメントで i の値が 45 に対してテストされ、p に格納されているアドレスまたは q に格納されているアドレスのいずれかが返されます。このアドレスは main( ) の c に収集され、印刷されたようです。そして、そこにエラーがあります。関数 check( ) は整数ポインタを返すことができません。返すことができるのは通常の整数だけです。したがって、c を整数ポインターとして宣言するだけでは十分ではありません。プログラムを正しく動作させるには、プログラムに次の変更を加える必要があります
#include <stdio.h>
int * check(int, int);
int main()
{
int *c;
c = check(10, 20);
printf("c = %p\n",c);
return 0;
}
int *check(int i, int j)
{
......
......
}
私の意見では、これは意味がありません。作成者は、コードの最初の部分で意図的にエラーを作成するために、割り当てられていないメモリ領域を指すポインタをメインで使用しようとします。しかし、彼が問題を解決しようとする方法はまったく正しくありません。彼は何も変更していません。代わりに、check() 関数でいくつかのメモリ領域を malloc する必要がありました。私は正しいですか?