我正在尝试计算排序算法。程序在使用调试器时运行,但问题在于它输出的内容。 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;
}
答案 0 :(得分:6)
C具有k个元素,索引从0到k-1。但是,A中的最大值等于k。因此,在某些时候,您正在访问C [k],它指向您不拥有的内存。
答案 1 :(得分:0)
您的代码中存在两个问题。
首先: C
数组的大小较小,只能存储从k
到0
的{{1}}个元素,因此它不能能够存储k-1
数组的最大元素。数组A
的大小为C
第二:当您计算int* C = new int[k+1];
A
数组的频率时,您正在运行从C
到1
的循环而不是n
到0
,这可能会导致错误,因为数组'A n-1
的大小已编入索引。在填充is '0-based
数组时,您正在进行类似的错误,其中您应该从B
运行n-1
到0
。
这是正确运行的正确。
#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;
}