题目描述
在学习计数排序的过程中出现访问位置冲突
题目来源及自己的思路
相关代码
#include<stdio.h>
#include<string.h>
#include "fz.h"//包含structure函数来给数组生成随机数,print函数来打印数组
#define N 10
void main()
{
int arr[N]={0}, max = arr[0];
structure(arr, N, 9);//给数组赋随机数,范围在0-9开区间
print(arr, N);//打印数组
for (int i = 0; i < N; i++)//寻找最大值
{
if(arr[i]>max)
max = arr[i];
}
int* count = (int*)malloc(sizeof(int)*(max+1));//计数数组count
memset(count, 0, max+1);
for (int i = 0; i < N; i++)//计数
{
count[arr[i]]++;
}
//int* count_2 = (int*)malloc(sizeof(max + 1));
for (int i = 1; i < max+1; i++)//累计
{
count[i] += count[i - 1];
}
int* output = (int*)malloc(sizeof(int) * N);//输出数组
for (int i = N-1; i >= 0; i--)
{
output[count[arr[i]] - 1]=arr[i];
count[arr[i]]--;
}
for (int i = 0; i < N; i++)//把结果返回原数组
{
arr[i] = output[i];
}
print(arr, N);
free(output);
free(count);
}
你期待的结果是什么?实际看到的错误信息又是什么?
在把结果放进输出数组中的时候VS报错,访问位置冲突
这一行代码 output[count[arr[i]] - 1]=arr[i];
memset 长度不对。应该是
sizeof(int)*(max+1)
可以使用 calloc 开辟 0 初始化的数组。