堆上的大型数组上的SIGSEGV(我想是这样)

时间:2014-01-14 08:53:12

标签: c++ arrays sigsegv

有大数组的sigsegv有问题。我发现它经常是在堆栈上分配的问题。但我在堆上分配这个数组仍然有SIGSEGV。我不确定是什么问题。

#include <cstdio>

using namespace std;

#define DATA_SIZE 1000000

static int inputArray[DATA_SIZE];

int* CountOnes(int* data)
{
    int outputArray[DATA_SIZE];
    int count, i;

    for (i = 0; i < DATA_SIZE; i++)
    {
        count = 0;
        while (*(data + i) > 0)
        {
            if (*(data + i) & 0x01)
                count++;

            *(data + i) >>= 1;
        }
        outputArray[i] = count;
    }
    return outputArray;
}

int main()
{
    CountOnes(inputArray);
    return 0;
}

我尝试使用静态全局数组,全局数组,使用new分配的数组进行分配。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您的outputArray仍在堆叠中分配。使用ulimit -s unlimited删除默认堆栈大小限制。另请注意,您将从CountOnes返回指向堆栈数组的指针。这不起作用,因为数组在退出函数时被销毁,因此返回的指针变为无效。您应该outputArray静态或使用new运算符分配它。

答案 1 :(得分:1)

  

我发现在堆栈上分配通常是个问题。

实际上,在大多数平台上,堆栈非常小(通常从几十千字节到几兆字节),并且如果您创建大型自动对象,则很容易溢出。具体来说,outputArray(可能)是4兆字节,(可能)太大了。

  

我尝试使用静态全局数组,全局数组,使用new分配的数组进行分配。

其中任何一个都应该有效,但还有其他问题 - 静态数组(本地或全局)会阻止重入和线程安全,new要求你跳过箍来正确删除数组。最好的选择是std::vector<int>,这是一个动态数组,可以自动管理(堆分配的)内存。