5

如果我有这样的结构:

struct S
{
    int arr[10];
    int x;
}

如果我有一个功能

void some_fun( struct S myS );

当我将 struct S 传递给该函数时,数组是否会被正确复制,或者我是否必须将函数更改为:

void some_fun( struct S * myS ); ?

我已经对此进行了测试(并且它在没有指针的情况下工作)但是我对 C/C++ 有点不安全,有时即使它是错误的它也可以工作。

4

5 回答 5

6

当我将结构 S 传递给该函数时,数组是否会被正确复制

是的,它会被复制。

我是否必须将功能更改为:void some_fun( struct S * myS )

您可能出于以下三个原因想要这样做:

  • 您想避免复制- 传递指针更便宜
  • 您想对内部的结构进行更改some_fun- 指针可以让您这样做;按值传递不
  • 您想降低堆栈溢出的风险——如果数组很大,按值传递可能会使堆栈溢出。通过指针传递大大降低了这种风险。

编辑:由于这是 C++,您可以选择struct通过引用传递:

void some_fun( S& myS ) // struct keyword is optional in C++

或者

void some_fun( const S& myS ) // Do this if you do not plan on modifying myS

通过引用传递避免了以类似于通过指针传递的方式进行复制。与通过指针传递不同,通过引用传递向读者表明struct传入的引用引用了内存中的某个位置,而指针为您提供了传递 a 的选项NULL

于 2013-08-20T14:20:40.673 回答
1

如果您按值传递,就像您目前所做的那样,您的数组将被默认的复制构造函数复制(参见例如:如何在复制控制函数中处理 C++ 数组成员?)。

如果您决定通过指针传递,则只会将指向同一结构的指针传递给它 - 因此您的数组不会被复制,您对数组(或结构的任何其他成员)所做的任何更改都将反映回您在函数之外访问的对象。

最终,归结为这些事情来决定选择哪种方法:

  • 您需要在函数中复制吗?如果没有,通过const 引用传递会更好
  • 您是否需要修改与函数外部完全相同的结构?然后使用指针方法(或引用)。
  • 您是否需要函数中的副本,因为您想修改函数中的结构,但这些更改不应该反映回调用位置?然后使用您当前使用的按值传递方法!
于 2013-08-20T14:19:37.180 回答
0

它将传递您的数据结构的副本。这很好,除非你想some_fun改变你传入的实际数据结构,然后你需要一个指针或引用。

于 2013-08-20T14:22:43.727 回答
0

当您放置一个具有 const 边界的数组时,不再决定运行时结构的大小。所以在你的情况下,数组是结构的一部分,而不是存储在不同的地方。很简单:是的,它将被解析为函数!

于 2013-08-20T14:23:04.730 回答
0

您有 3 个选项:

本地复制版本:

void some_fun( struct S myS );

指针版本:

 void some_fun( struct S* myS );

参考版本:

void some_fun( struct S& myS );

在后两者中,对 myS 所做的更改将是持久的(影响原始实例)。在第一种情况下,您将拥有一个本地副本。

于 2013-08-20T14:20:57.913 回答