0

私はCの構造体について学んでいます。構造体を引数として別の関数に渡すとき、正確には何をしているのでしょうか。すべてのメンバー値を別の関数にコピーしていますか?引数として配列を渡すときは、配列の最初のアドレスであるarray[0]を渡します。構造的にはそれほど単純ではないようです。私の推測では、値をコピーしたり、アドレスを渡したりすることはありません。必要に応じて、渡される構造体のメンバーのアドレスを使用できるようにコンパイラーに指示しています。よくわかりませんが..助けていただければ幸いです。

4

4 に答える 4

1

構造は、値と参照の両方で渡すことができます。大きな構造体がある場合は、参照によって渡すことをお勧めします。そうでない場合、渡された構造体のコピーが呼び出された関数で作成されるため、大量のスタックスペースが消費される可能性があります。これを読んで、構造体の受け渡しについて詳しく知る

ポインタを渡すのではなく、Cで値によって構造体を渡すことの欠点はありますか?

于 2012-05-03T14:04:09.757 に答える
1

それはどのように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(アドレス= 0013FF74、値= 20)
my_x(アドレス= 0013FF74、値= 20)
于 2012-05-03T14:06:51.510 に答える
1
#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;
}

あなたがそれをコンパイルして実行するならば、これはあなたの質問に答えるはずです。

于 2012-05-03T14:13:31.807 に答える
0

関数を呼び出す前に、コンパイラーは最初にパラメーターをスタックにプッシュし、次に関数を呼び出します。したがって、関数はスタックからパラメーターを取得できます。

アドレスによって渡されると、アドレスは関数に渡されます。また、コンパイラは、パフォーマンスを向上させるために、「メモリアライメント」などと呼ばれるパラメータメモリも処理します。したがって、関数では、そのメモリブロックを構造体に簡単に変換できます。

値が渡されると、コンパイラはパラメータを処理し、処理されたパラメータアドレスを関数に渡します。

ちなみに、1つのプロセスでメモリアドレスは同じです。どの機能でも使用できます。

于 2012-05-03T14:18:06.317 に答える