具有堆分配的大型数组的分段错误

Posted

技术标签:

【中文标题】具有堆分配的大型数组的分段错误【英文标题】:Segmentation fault on large size array with heap allocation 【发布时间】:2016-08-18 03:32:31 【问题描述】:

以下代码在 4Gb 机器上运行时会出现分段错误,即使在我将空间动态分配给包含 1000 万个条目的数组之后也是如此。它适用于 100 万个条目,即 n = 1000000。以下代码使用基数排序对整数值及其索引值进行排序。我应该怎么做才能使这个程序适用于 1000 万个条目?

int main()

    int n=10000000; // 10 million entries
    int *arr=new int [n]; // declare heap memory for array 
    int *arri=new int [n]; // declare heap memory for array index

    for(int i=0;i<n;i++)  // initialize array with random number from 0-100
        
            arr[i]=((rand()%100)+0);
        

    for(i=0;i<n;i++)   // initialize index position for array
        
            arri[i]=i;
        

    radixsort(arr, n ,arri);
    return 0;


// The main function to that sorts arr[] of size n using Radix Sort
void radixsort(int *arr, int n,int *arri)
   int m=99; //getMax(arr,n,arri);

    // Find the maximum number to know number of digits


    // Do counting sort for every digit. Note that instead
    // of passing digit number, exp is passed. exp is 10^i
    // where i is current digit number
    for (int exp = 1; m/exp > 0; exp *= 10)
        countSort(arr, n, exp,arri);




void countSort(int *arr, int n, int exp,int *arri)

    int output[n],output1[n]; // output array
    int i, count[10] = 0;

    // Store count of occurrences in count[]
    for (i = 0; i < n; i++)
        
            count[ (arr[i]/exp)%10 ]++;

        

    // Change count[i] so that count[i] now contains actual
    //  position of this digit in output[]
    for (i = 1; i < 10; i++)
        count[i] += count[i - 1];

    // Build the output array
    for (i = n - 1; i >= 0; i--)
        

            output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
            output1[count[ (arr[i]/exp)%10 ] - 1] = arri[i];
            count[ (arr[i]/exp)%10 ]--;
        

    // Copy the output array to arr[], so that arr[] now
    // contains sorted numbers according to current digit
    for (i = 0; i < n; i++)
        
            arr[i] = output[i];
            arri[i]=output1[i];
        


【问题讨论】:

countSort 中的数组不是动态分配的。 请注意,可变长度数组不是标准 C++。它们在 C 中,您的编译器允许它们作为扩展。 【参考方案1】:

问题出在countSortoutputoutput1 数组是局部数组,不是动态分配的,对于局部变量来说它们太大了。您还使用了不属于标准 C++ 的可变长度数组的 C 特性。将它们更改为:

int *output = new int[n];
int *output1 = new int[n];

并添加

delete[] output;
delete[] output1;

在函数的末尾。

【讨论】:

最好改用std::vector。让它为你管理内存。 或者,根据平台和工具链,设置适当的链接器标志以保留足够的堆栈空间来容纳本地数组。 @RemyLebeau 我不想重新设计程序,只是显示他的错误的简单修复。他以为他没有使用本地数组,他错过了这个地方。

以上是关于具有堆分配的大型数组的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C ++中动态分配的向量中的分段错误

gcc,c++:静态字符串成员变量导致堆损坏/分段错误

为啥大型静态数组会产生段错误而动态却不会? (C++)

大型二维数组给出分段错误

为具有双指针的结构内的动态结构数组分配内存**

C - 将值分配给结构数组的分段错误