【问题标题】:Segmentation fault when returning an array返回数组时出现分段错误
【发布时间】:2021-05-16 15:08:56
【问题描述】:

我试图解决this code。我们必须返回一个数组作为函数的输出。我必须编码的函数是这样给出的。

 int *findTwoElement(int *arr, int n) {
        // code here
    }

当我声明我的ans 数组时,如下表所示并返回它,我得到一个segmentation fault

int ans[2];
ans[0]=b;
ans[1]=a;
        
return ans; 

但是当我声明我的 ans 数组时,如下表所示并返回它,它工作正常

int *ans=new int(2);
   
ans[0]=b;
ans[1]=a;
    
return ans;

EDIT--> 那么如果第一个代码返回segmentation fault,那么这段代码(如下所示)如何正常工作?

#include <iostream>
using namespace std;
 
int* fun()
{
    int arr[100];
 
    /* Some operations on arr[] */
    arr[0] = 10;
    arr[1] = 20;
 
    return arr;
}
 
int main()
{
    int* ptr = fun();
    cout << ptr[0] << " " << ptr[1];
    return 0;
}

我没有明白我做错了什么。任何帮助将不胜感激。谢谢你。 :)

【问题讨论】:

  • 您不能从函数返回 C 数组。
  • int ans[2];ans 定义为 local 变量。当函数返回时,它的生命周期将结束,留下一个无效的指针。
  • 第二个代码也不正确,因为您只为一个int 分配空间。你会想要new int[2];
  • 嘿,我已经编辑了
  • 欢迎来到 undefined behavior 的美妙世界,有时事情可能似乎正常工作(但实际上并非如此),只是在你最不期望的时候崩溃。

标签: c++ arrays return-value


【解决方案1】:

如果int ans[2];在函数内部声明,则它是一个具有自动存储时长的数组,从函数返回时它的生命就结束了,所以你不能在返回后使用指向它的指针。 p>

另请注意,int *ans=new int(2); 不是分配 2 元素数组,而是分配具有初始值 2 的单个 int。分配数组应该是int *ans=new int[2];

【讨论】:

  • 我已经进行了编辑,你能告诉那为什么最后的代码运行良好吗?
  • 这是偶然的。也许堆栈上有足够的空间来防止数据被覆盖。
  • 好的.. 非常感谢。 :)
【解决方案2】:

最后一个代码可能运行良好,因为并非每个无效指针都会自动导致分段错误。它可能仍然指向属于您的程序的内存区域,因此您可能能够读取和写入它。只是不能保证它在任何时候都不会被覆盖。

【讨论】:

  • 非常感谢 :)
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多