计算排序输出问题:读取访问冲突

时间:2018-02-26 19:14:08

标签: c++

我正在尝试计算排序算法。程序在使用调试器时运行,但问题在于它输出的内容。 visual studio中的输出值为-842150451。我不确定为什么我会得到那些价值观。我也将这个弹出:

  

“抛出未处理的异常:读取访问冲突。”    C 是0x34B6F822。发生“

我做错了什么?

这是代码

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector> 


using namespace std;

void count(int A[], int B[], int k, int n) {


int i;
int j;

int* C = new int[k];


for (i = 0; i < k+1; i++) {
    C[i] = 0;
}

for (j = 1; j <= n; j++) {
    C[A[j]]++; // this is where the 0x34B6F822 error is

}

for (i = 1; i <= k; i++) {
    C[i] +=  C[i - 1];
}

for (j = n; j >= 1; j--) {
    B[C[A[j]]] = A[j];
    C[A[j]] = C[A[j]] - 1;
}


}



int main()
  {
int A[] = { 6,5,8,4,3 };
int n = sizeof(A) / sizeof(*A);
int k = 0;

for (int i = 0; i < n; i++) {
    if (A[i] > k)
        k = A[i];
}


int* B = new int[n];

int j;
for (j = 0; j < n; j++)
    printf("%d ", B[j]);
printf("\n");

count(A, B, k, n);


return 0;
}

2 个答案:

答案 0 :(得分:6)

C具有k个元素,索引从0到k-1。但是,A中的最大值等于k。因此,在某些时候,您正在访问C [k],它指向您不拥有的内存。

答案 1 :(得分:0)

您的代码中存在两个问题。

首先: C数组的大小较小,只能存储从k0的{​​{1}}个元素,因此它不能能够存储k-1数组的最大元素。数组A的大小为C

第二:当您计算int* C = new int[k+1]; A数组的频率时,您正在运行从C1的循环而不是n0,这可能会导致错误,因为数组'A n-1的大小已编入索引。在填充is '0-based数组时,您正在进行类似的错误,其中您应该从B运行n-10

这是正确运行的正确。

#include <iostream>
#include <fstream>
#include <vector> 


using namespace std;

void count(int A[], int B[], int k, int n) {


int i;
int j;

int* C = new int[k+1];


for (i = 0; i < k+1; i++) {
    C[i] = 0;
}

for (j = 0; j <n; j++) {
    C[A[j]]++; //  error is removed

}




for (i = 1; i <= k; i++) {
    C[i] +=  C[i - 1];
}



for (j = n-1; j >= 0; j--) {
    B[C[A[j]]-1] = A[j];
    C[A[j]] = C[A[j]] - 1;
}


}



int main()
  {
int A[] = { 6,5,8,4,3 };
int n = sizeof(A) / sizeof(*A);
int k = 0;

for (int i = 0; i < n; i++) {
    if (A[i] > k)
        k = A[i];
}


int* B = new int[n];

int j;


count(A, B, k, n);

for (j = 0; j < n; j++)
    printf("%d ", B[j]);
printf("\n");
return 0;
}