计数排序中的内存相关错误?

时间:2011-10-11 01:56:18

标签: c arrays malloc

我一直在尝试实施计数排序。

它向用户请求程序运行的次数n。 将排序的元素数sz和具有最大值k的元素。虽然该程序与n = 1正确运行,即运行一次,但在其他情况下我收到错误。

#include <stdio.h>
#include <stdlib.h>

void cntsrt(int a[], int b[], int k);

int sz;

int main(int argc, char **argv) {
    int n, k,*b, *a, i, j;

    scanf("%d", &n);

    while (n--) {
        scanf("%d", &sz);
        scanf("%d", &k);

        a = (int *) calloc(sz + 1, sizeof(int));

        for (i = 1; i <= sz; i++)
            scanf("%d", &a[i]);

        b = (int *) calloc(sz + 1, sizeof(int));

        cntsrt(a, b, k);
        printf("\n");

        for (j = 1; j <= sz; j++)
            printf("\t%d", b[j]);

        free((void*)a);
        free((void*)b);
    }

    printf("\n");

    return 0;
}

void cntsrt(int a[], int b[], int k) {
    int  i, j,*c;

    c = (int*) malloc(k*(sizeof(int)));

    for (i = 0; i <= k; i++)
        c[i] = 0;

    for (j = 1; j <= sz; j++)
        c[a[j]] = c[a[j]] + 1;

    for (i = 1; i <= k; i++)
        c[i] = c[i] + c[i - 1];

    for (j = 8; j > 0; j--) {
        b[c[a[j]]] = a[j];
        c[a[j]] = c[a[j]] - 1;
    }
}

1 个答案:

答案 0 :(得分:2)

 a = (int *) calloc(sz + 1, sizeof(int));
for (i = 1; i <= sz; i++)
    scanf("%d", &a[i]);

数组索引应从 0 开始到 sz

在函数cntsrt -

 c = (int*) malloc(k*(sizeof(int)));
 for (i = 0; i <= k; i++)  // should be < k. There is no kth index
     c[i] = 0;

如果数组的长度 n ,那么它的可访问索引是从 0 n-1