【问题标题】:c++ function returning incorrect arrayc ++函数返回不正确的数组
【发布时间】:2015-12-12 21:52:36
【问题描述】:

我正在尝试创建一个名为getSortedRanks 的函数,它返回一个数组。我从这个问题Return array in a function 复制了返回数组的格式,但数组没有正确返回。

#include <stdlib.h>
#include <stdio.h>
#define familyMembers 4

int *getSortedRanks()
{
    int rankedMembers[familyMembers] = {3,4,2,1};
    return rankedMembers;
}

int main()
{
    int *sortedRanks = getSortedRanks();

    //print the returned array
    for(int i = 0; i < familyMembers; i ++)
    {
        cout << "ranked member is " << sortedRanks[i] << endl;
    }

    return 0;
}

当我运行它时,输出是:

ranked member is 3
ranked member is 0
ranked member is 0
ranked member is 2686744

数组sortedRanks 的第一个元素始终正确,但其他元素不正确。如何更正数组的返回方式?

【问题讨论】:

标签: c++ arrays function pointers


【解决方案1】:

自动存储时长的数组:

int rankedMembers[familyMembers] = {3, 4, 2, 1};

存在于堆栈中并在getSortedRanks 完成后被销毁。返回的指针无效。取消引用它会导致undefined behavior

你要么想要:

  1. 动态分配数组(在堆上),因为您将管理它的生命周期:

    int *getSortedRanks()
    {
        return new int[familyMembers]{3, 4, 2, 1};
    }
    

    使用后别忘了delete []它。使用smart pointer 将帮助您。

  2. 使用std::vectorstd::array并按值返回:

    std::array<int, familyMembers> getSortedRanks()
    {
        return {3, 4, 2, 1};
    }
    

(从低到高排序)

【讨论】:

  • 我现在明白了。谢谢解释
  • 数组rankedMembers 不是静态分配的。函数返回后不存在的原因是它具有自动存储时长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多