有大数组的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分配的数组进行分配。有什么想法吗?
答案 0 :(得分:1)
您的outputArray
仍在堆叠中分配。使用ulimit -s unlimited
删除默认堆栈大小限制。另请注意,您将从CountOnes
返回指向堆栈数组的指针。这不起作用,因为数组在退出函数时被销毁,因此返回的指针变为无效。您应该outputArray
静态或使用new
运算符分配它。
答案 1 :(得分:1)
我发现在堆栈上分配通常是个问题。
实际上,在大多数平台上,堆栈非常小(通常从几十千字节到几兆字节),并且如果您创建大型自动对象,则很容易溢出。具体来说,outputArray
(可能)是4兆字节,(可能)太大了。
我尝试使用静态全局数组,全局数组,使用new分配的数组进行分配。
其中任何一个都应该有效,但还有其他问题 - 静态数组(本地或全局)会阻止重入和线程安全,new
要求你跳过箍来正确删除数组。最好的选择是std::vector<int>
,这是一个动态数组,可以自动管理(堆分配的)内存。