Segmentation Fault chkstk_ms C++



我需要以下计数排序实现的帮助。是因为x的值太大了吗?我得到分割错误。这是gdb说的:

Program received signal SIGSEGV, Segmentation fault.
___chkstk_ms () at /usr/src/debug/gcc-5.4.0- 1/libgcc/config/i386/cygwin.S:146
146     /usr/src/debug/gcc-5.4.0-1/libgcc/config/i386/cygwin.S: No such file or directory.
这里是代码片段,
void radix_sort::sort_array(int array[], int n)
{
    int arrayB[n];
    auto k = *std::max_element(&array[0], &array[n - 1]);
    auto m = *std::min_element(&array[0], &array[n - 1]);
    long int x = k - m + 1;
    int arrayC[x];
    for (auto i = 0; i < n; i++)
        arrayC[array[i] - m]++;
    for (long int i = 1; i < x; i++)
        arrayC[i] = arrayC[i] + arrayC[i - 1];
    for (auto i = n - 1; i >= 0; i--)
    {
        arrayB[arrayC[array[i] - m] - 1] = array[i];
        arrayC[array[i] - m]--;
    }
    for (int i = 0; i < n; i++)
        array[i] = arrayB[i];
}

In

arrayC[array[i] - m]++;

在代码的这一点上,没有arrayC的元素被分配,所以一个未知的数字被增加。这可能会爆炸

arrayB[arrayC[array[i] - m] - 1] = array[i];

后几行,因为arrayC[array[i] - m]可能是负的或几十亿,并且超出了我们所知道的范围

数组的声明

int arrayB[n];
int arrayC[x];

声明可变长度数组。变量长度数组不是标准的c++特性。你需要动态分配内存,而不是声明可变长度数组。

标准算法的调用

auto k = *std::max_element(&array[0], &array[n - 1]);
auto m = *std::min_element(&array[0], &array[n - 1]);

忽略数组array的最后一个元素。相反,你需要写

auto k = *std::max_element( array, array + n );
auto m = *std::min_element( array, array + n );

数组arrayC未初始化。

int arrayC[x];

那么这个语句

arrayC[array[i] - m]++;

调用未定义行为。

注意,在函数内,您需要检查n大于0

函数可以按照以下方式声明和定义:

void radix_sort::sort_array( int a[], size_t n )
{
    if (n)
    {
        auto minmax = std::minmax_element( a, a + n );
        auto min = *minmax.first, max = *minmax.second;
        size_t k = max - min + 1;
        auto p = std::make_unique<int[]>( k );
        for (size_t i = 0; i < n; i++)
        {
            ++p[a[i] - min];
        }
        std::partial_sum( p.get(), p.get() + k, p.get() );
        auto b = std::make_unique<int[]>( n );
        for (size_t i = n; i-- != 0; )
        {
            b[--p[a[i] - min]] = a[i];
        }
        std::copy( b.get(), b.get() + n, a );
    }
}

相关内容

  • 没有找到相关文章

最新更新