構造体を別の関数の引数として渡すとき、Cの構造体について学習しています。他の関数ですべてのメンバー値をコピーしていますか?引数として配列を渡すと、配列の最初のアドレス(array [0])が渡されます。物事は構造がとてもシンプルに見えません。私の推測では、値をコピーすることも、住所を渡すこともないということです。必要に応じて渡される構造体のメンバのアドレスを使用できるようにコンパイラに指示します。私は確信していますが..どんな助けもありがとうございます。構造体を使用してCで参照されるメモリ
答えて
#include <stdio.h>
struct foo {
int a;
}
void by_value(struct foo x) {
x.a = 10;
}
void by_reference(struct foo* x) {
x->a = 10;
}
int main(int argc, char* argv[]) {
struct foo v;
v.a = 5;
by_value(v);
printf("%d\n", v.a);
by_reference(&v);
printf("%d\n", v.a);
return 0;
}
コンパイルして実行すると、これはあなたの質問に答えるはずです。
Structresは値と参照の両方で渡すことができます。渡された構造体のコピーが呼び出される関数 に説明するようスタック空間の膨大な量を消費することができる他の参照によって渡すことがそのことをお勧め大きな構造がある場合
Are there any downsides to passing structs by value in C, rather than passing a pointer?
を渡す構造についての詳細を知るために、これを読んでしたがって、構造体は配列とは異なり、ソースコードファイル内のすべての関数でグローバルに使用できるわけではありませんか?私はそう言うことができますか?他の機能がそれらを必要とするたびにそれらを渡す必要がありますか? – KawaiKx
@Saurabhいいえ。すべての機能でアクセスできる配列のようなグローバル構造があります。値渡しできるという理由だけでは、それらが関数間でアクセスする唯一の方法ではありません。 –
それはstruct
が渡された方法によって異なります。値によって渡された場合
- コピーが作られ、
struct
に関数の内部で行われた変更は、呼び出し側に表示されていない - 参照によって渡された場合、コピーが作られ、
struct
に関数内の変更は、例えば、発信者
に表示されていない。
#include <stdio.h>
struct X {
int value;
};
void pass_by_value(struct X a_x)
{
a_x.value = 10;
printf("by_value(address=%p, value=%d)\n", &a_x, a_x.value);
}
void pass_by_ref(struct X* a_x)
{
a_x->value = 20;
printf("by_ref(address=%p, value=%d)\n", a_x, a_x->value);
}
int main()
{
struct X my_x = { 1 };
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
pass_by_value(my_x);
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
pass_by_ref(&my_x);
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
return 0;
}
は出力:
my_x(address=0013FF74, value=1) by_value(address=0013FF78, value=10) my_x(address=0013FF74, value=1) by_ref(address=0013FF74, value=20) my_x(address=0013FF74, value=20)
コンパイラは、関数を呼び出す前に、まずパラメータをスタックにプッシュしてから関数を呼び出します。 したがって、関数はスタックからパラメータを取得できます。
アドレスで渡されると、アドレスが関数に渡されます。 また、コンパイラは、パフォーマンスを向上させるために、 "メモリアラインメント"と呼ばれるパラメータメモリも処理します。 あなたの関数では、そのブロックを簡単に構造体に変換することができます。
コンパイラは、渡されたときにパラメータをコピーし、対応するパラメータアドレスを関数に渡します。
ちなみに、1つのプロセスでは、メモリアドレスは同じです。 どの機能でも使用できます。
- 1. 参照を使用して構造体を一致させる
- 2. 構造体Cでの二重参照
- 3. 構造体へのcコードの参照
- 4. 構造体をC言語で参照渡しします
- 5. 構造体の配列をC++での参照渡し
- 6. cでの参照渡しの構造体
- 7. 構造体の配列を参照してください
- 8. (Cで)構造体の配列を逆参照
- 9. 構造体への参照を戻す
- 10. 構造体への参照をC#リストに追加する
- 11. C構造体の整数ポインタを参照解除する
- 12. C:構造体の使用
- 13. cでリンクされたリスト、構造体の構造体、セグメンテーションフォールト
- 14. Segfaultsと構造体配列の参照
- 15. リスト+構造体:オブジェクト参照オブジェクト
- 16. いつCの空きメモリ構造体
- 17. C#データの局所性:構造体の配列の参照型
- 18. Cエラー:不完全な型へのポインタ逆参照、構造体
- 19. 構造体の配列を参照して呼び出す
- 20. Cヘッダファイル(.h)に自己参照構造体を定義していますか?
- 21. 構造体を参照し、2つの異なる方法を参照してください
- 22. C++でクロスプラットフォーム構造体を作成して使用する
- 23. 構造体を作成し、構造体を参照してベクトルを渡します
- 24. ヒープ参照を使用して構造体をイディオムで構築する方法は?
- 25. 参照ベクトルを使用して構造体を作成するにはどうすればよいですか?
- 26. C# - 構造体をフォームに参照と戻り値で渡しますか?
- 27. C++:構造体の配列を参照渡しで関数に渡す
- 28. iOS、Objective Cで構造体を使用し、スーパービューから割り当てられない構造体の値
- 29. マーシャルC#を使用してマネージコードに管理されていない構造体
- 30. ネストされた構造体に割り当てるメモリ
構造にメンバーが多い場合はどうなりますか? – KawaiKx
@Saurabh値で渡すと、その中のすべてがコピーされます。メンバーの数は関係ありません。しかし、コピーは浅いことに留意してください。これは、構造体にポインタが含まれている場合、ポインターの値がコピーされ、ポインターの値はコピーされないことを意味します。 – HonkyTonk
は配列のように、構造体をグローバルに宣言できますか?または構造特有の機能ですか? – KawaiKx