使用结构在C中进行内存引用

时间:2012-05-03 14:00:25

标签: c memory reference structure arguments

当我将结构作为参数传递给另一个函数时,我正在学习C.中的结构,我们究竟在做什么?我们在另一个函数中复制所有成员值吗?当我们传递数组作为参数时,我们传递数组的第一个地址 - array [0]。事情看起来并不那么简单。我的猜测是我们既不复制任何价值也不传递任何地址。我们告诉编译器准备好在需要时使用传递的结构成员的地址。我不确定..任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

结构可以通过值和引用传递。如果有一个大的结构,建议通过引用传递,否则可能会消耗大量的堆栈空间,因为传递的结构的副本将在被调用的函数中进行 阅读本文以了解有关结构传递的更多信息

Are there any downsides to passing structs by value in C, rather than passing a pointer?

答案 1 :(得分: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(address=0013FF74, value=20)
my_x(address=0013FF74, value=20)

答案 2 :(得分: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;
}

如果您编译并运行它,这应该回答您的问题。

答案 3 :(得分:0)

在调用函数之前,编译器首先将参数压入堆栈,然后调用函数。 因此,该函数可以从堆栈中获取参数。

当通过地址传递时,地址将传递给该函数。 并且编译器还将处理参数存储器,称为“存储器对齐”或类似的东西,以提高性能。 因此,在您的函数中,您可以轻松地将该内存块转换为结构。

当按值传递时,编译器会处理参数并将coped参数地址传递给您的函数。

顺便说一句,在一个过程中,内存地址是相同的。 任何功能都可以使用它。