为什么每次我运行这个程序时都会得到分段错误?

  • 本文关键字:错误 分段 程序 运行 c++
  • 更新时间 :
  • 英文 :


每次我运行这个程序,我得到一个分割错误,我不知道为什么。函数是排序数组,这段代码做的,但每次我试图运行它,我得到一个错误,说分割错误核心转储。

#include <iostream>
void counting_sort(int *array, unsigned array_len) {
int output[array_len];
int max;
for (int i = 0; i < array_len; i++) {
if (array[i] > max) {
max = array[i];
}
}
int count[max + 1];
for (int i = 1; i <= max; i++) {
count[i] = 0;
}
for (int i = 0; i < array_len; i++) {
count[array[i]]++;
}
for (int i = 1; i <= max; i++) {
count[i] += count[i - 1];
}
for (int i = array_len - 1; i >= 0; i--) {
output[count[array[i]] - 1] = array[i];
count[array[i]]--;
}
for (int i = 0; i < array_len; i++) {
array[i] = output[i];
}
std::cout << array[1];
}
} // namespace cs19
int main() {
int num = 3;
int arr[num];
arr[0] = 4;
arr[1] = 2;
arr[2] = 7;
counting_sort(arr, num);
return 0;
}

谁能告诉我为什么会发生这种情况以及如何解决它?我对编码有点陌生,所以我正在努力弄清楚是什么导致了这一点。

根据c++标准,c++数组的大小必须为编译时间常数.

所以不能有

int num = 5;
int MyArray[num]; // incorrect

正确的方法是:

const int num = 5;
int MyArray[num]; // correct

这只是示例代码中的一个问题。您已经在代码中这样做了两次。首先是main中名为arr的数组,然后是被调用函数中名为output的数组。对于名为count的数组也类似。

问题是您将max作为内置局部变量,并且尚未显式初始化它。所以它会有一个垃圾值

您可以在运行时确定大小的地方使用std::vector。下面的工作示例显示了使用std::vector而不是内置数组的实现。

#include <iostream>
#include <vector>
void counting_sort(std::vector<int> &vec) {
std::vector<int> output(vec.size());
int max = 0;
for (int i = 0; i < vec.size(); i++) {
if (vec[i] > max) {
max = vec[i];
}
}
std::vector<int> count(max +1);
for (int i = 1; i <= max; i++) {
count[i] = 0;
}
for (int i = 0; i < vec.size(); i++) {
count[vec[i]]++;
}
for (int i = 1; i <= max; i++) {
count[i] += count[i - 1];
}
for (int i = vec.size() - 1; i >= 0; i--) {
output[count[vec[i]] - 1] = vec[i];
count[vec[i]]--;
}
for (int i = 0; i < vec.size(); i++) {
vec[i] = output[i];
}
//std::cout << vec[1];
}

int main() {
int num = 3;
std::vector<int> myvec(num);
myvec[0] = 4;
myvec[1] = 2;
myvec[2] = 7;

std::cout<<"before sorting: "<<std::endl;
for(const int &i: myvec)
{
std::cout<<i<<std::endl;
}
//sort the vector by calling the counting_sort function
counting_sort(myvec);

std::cout<<"after sorting: "<<std::endl;
for(const int &i: myvec)
{
std::cout<<i<<std::endl;
}
return 0;
}

max变量未初始化。将其初始化为0,并应按预期工作。这在releaseno-opt(调试)模式下是不同的。

改变
int max;

int max=0;

如果max变量未初始化,则value为undefined。这意味着count数组将使用2342525或类似的范围创建,并导致问题。

最新更新