次のコードが機能するようです。 gcc 5.2.1 on linuxは警告を出さなかった。メモリを1つの関数に割り当て、別の関数で使用する
私はCの初心者です。&と*演算子が英語の文章と試行錯誤を使って各行で何を行うのかを書き留めることで、これを実現しました。
わからないことが2つあります。
ラインAのp0
の初期値は予測できません。しかし、E行はmainの変数p0の値で指定されたアドレスに値を割り当てます。これで問題はありますか?もしそうなら、それを修正する方法は?
コードは非常に*使用していますが、***のように行Cで使用できますか?
ありがとうございます。
#include <stdlib.h>
#include <stdio.h>
void* f(int*** ptr_p) //C
{
int** p = *(ptr_p); //D
*p = malloc(8); //E
*(*p) = 200; //F
(*p)[1] = 4; //G
}
int main(void)
{
int** p0; //A
f(&p0); //B
printf("%d, %d\n",*(*p0), (*p0)[1]);
free(*p0); //H
}
英語の文章を見たい場合は、ここにあります。
警告:私はCの初心者ですが、すべて正しいかどうかわかりません。
ライン[A] int** p0;
p0
の値は予測不能です。
ライン[B]はf(&p0);
&p0
可変p0
のアドレスです。 f(&p0)
は、関数f
を呼び出して、関数の第1引数に&p0
を代入することを意味します。
ライン[C] void* f(int*** ptr_p)
ラインBはptr_p
に&p0
割り当てます。これは、ptr_p
の値が、メイン関数の変数p0
のアドレスに等しいことを意味します。
ライン[D] int** p = *(ptr_p);
*(ptr_p)
アドレスとして解釈ptr_p
の値によって指定されたアドレスの値を意味します。 ptr_p
の値は、メイン関数の変数p0
のアドレスです(行Cで説明しています)。したがって、*(ptr_p)
は、main関数の変数p0
の値です。
p = *(ptr_p);
手段は、ライン[E] *(p) = malloc(8);
*(p)
がp
の値によって指定されたアドレスの値を意味p
の値に主な機能にp0
の値を割り当てます。 p
の値は、ライン[D]で説明されているように、メイン変数p0
の値です。次に、*(p)
は、p0
変数の値で指定されたアドレスの値を意味します。main()
です。
malloc(8)
は、メモリに8バイトを予約し、8バイトの最初のアドレスを返します。
行全体は、p0
変数で指定されたアドレスの値として、これらの8バイトのうちの最初のアドレスをmain()
に割り当てることを意味します。
ライン[F] *(*p) = 200;
ライン[G]は(*p)[1] = 4;
(p)[1]
*(p + 1)
(*p)[1]
が意味を意味*(*p + 1)
3:10 am、私は今眠る。明日の回答をチェックします。これは楽しく便利です。前もって感謝します。 – rxu