【问题标题】:Wrong output on c++ arraysc++ 数组上的错误输出
【发布时间】:2021-07-12 03:13:50
【问题描述】:

我对 C++ 还很陌生,所以这个问题可能看起来很基础(愚蠢!)。我正在尝试返回一个 (int i, int j) 数组,它是一个位置(坐标)。

这是我的代码:

int* Unblocker(int d1[2],int d2[2])
{
int unblocker_position[2];
int distance;
distance = abs(d1[0]-d2[0])+ abs(d1[1]-d2[1]);
switch (distance)
{
case 1:
    break;
case 2:
    switch (abs(d1[0] - d2[0]))
    {
    case 2:
        unblocker_position[0] = 1;
        unblocker_position[1] = 0;
        return unblocker_position;
        break;
    default:
        return NULL;
        break;
    }
    break;
default:
    return NULL;
    break;
}
}

int main(){
   int p1[2]={0,0};
   int p2[2]={2,0};
   int * a = Unblocker(p1,p2);
   cout << a[0] << " " << a[1] << endl;
   return 0;}

输出是:

  1 1 

但是,我期望“1 0”。我不确定是使用开关还是使用数组作为返回类型时出错了。我删除了 switch 中的其他案例,以便更容易进入重点。

【问题讨论】:

  • 返回一个指向局部变量的指针是未定义的行为。此外,如果distance 为1,则不会执行return 语句,这也是未定义行为
  • 完美!所以我只需要将 unblocker_position 定义为全局。谢谢@RemyLebeau!
  • 如果你使用std::array,你会避免它(局部变量返回部分)。
  • std::pair。或者一个简单的用户定义的 2 元素结构。

标签: c++ arrays switch-statement


【解决方案1】:

如果要返回指向局部变量的指针,则需要将变量存储在堆中。为此,您必须使用 new 运算符。

int *Unblocker(int d1[2], int d2[2])
{
    int *unblocker_position = new int[2];
    int distance;
    distance = abs(d1[0] - d2[0]) + abs(d1[1] - d2[1]);
    switch (distance)
    {
    case 1:
        break;
    case 2:
        switch (abs(d1[0] - d2[0]))
        {
        case 2:
            unblocker_position[0] = 1;
            unblocker_position[1] = 0;
            return unblocker_position;
            break;
        default:
            return NULL;
            break;
        }
        break;
    default:
        return NULL;
        break;
    }
    return NULL;
}

int main()
{
    int p1[2] = {0, 0};
    int p2[2] = {2, 0};
    int *a = Unblocker(p1, p2);
    cout << a[0] << " " << a[1] << endl;
    delete a;
    return 0;
}

记得使用删除操作符来防止内存泄漏。

如果您想了解有关此主题的更多信息,我建议您查看smart pointers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多