【问题标题】:Passing array values from a function back into a struct将数组值从函数传递回结构
【发布时间】:2018-04-16 08:46:50
【问题描述】:

我目前正在开发一个程序,该程序需要一个函数来计算数组值,然后将这些值存储在 arr1[] 中,它的大小未知,并且在函数内计算。然后它将整个数组连同数组的大小一起传回主函数。使用结构,我返回了大小,但由于某种原因我无法返回数组。有人可以指导我正确的方向吗?

这是我的结构:

struct Arr
{
    int size_1;
    int arr_1[];
};

这是我返回数组的函数的一部分,其中arr1[] 是我需要返回的数组:

Arr smallElement(int arr[], int size)
{
    Arr tempArr;

    for (int count = 0; count < newSize; count++)
    {
        tempArr.arr_1[count] = arr1[count];
    }

    return tempArr;
}

这是我在我的 main 函数中用来调用函数来打印数组的,但它每次只打印 3 个随机数:

Arr a;
a = smallElement(array, n);
cout << "The array is: ";
for (int count = 0; count < a.size_1; count++)
{
    cout << a.arr_1[count] << " ";
}

【问题讨论】:

  • 请将您的代码显示为minimal reproducible example
  • 使用std::vector
  • 只是不要这样做...此代码容易出错,令人困惑,并且在当前状态下显示 UB,无论如何。 (tl;dr; 使用向量)
  • 灵活数组成员或 VLA 不是有效的 C++。
  • count &lt; newSize; newSize 是从哪里来的?

标签: c++ arrays function struct


【解决方案1】:

struct 中,int arr_1[] 没有定义实际的数组。它实际上只是一个称为灵活数组成员的占位符。在 C 中,这是通过为 struct 的完全定义部分分配内存加上数组的额外空间来使用的——当使用 malloc 或其他内存分配时,您必须手动添加空间。在标准 C++ 中,您不应该使用它。 (它不是标准 C++ 的一部分。它是一些编译器从 C 中采用的扩展,它是标准的。)

当您声明tempArr 时,它只创建了struct 的完全定义部分。当您将值分配给tempArr.arr_1[count] 时,那里没有分配的数组,因此行为未定义。当您返回 tempArr 时,将返回结构的副本,但同样,仅返回已定义部分的副本。

如果调用者知道数组的大小,您可能希望他们将数组传递给函数,可能通过使用new 分配它或使用std::vector 并通过引用传递向量。如果调用者不知道大小,那么您可能希望函数分配数组并返回指向它的指针(在这种情况下,调用者负责稍后删除它),或者您可能希望传递一个空 (或以其他方式可重复使用)std::vector 到函数,最好通过引用。在函数内部,它可以向向量添加更多元素,std::vector 将为您管理内存分配。

【讨论】:

  • “在 C++ 中,你可能想避免这种情况。” 你应该说他们确实想避免这种情况,因为它不是有效的 C++ 代码.
  • @underscore_d:完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多