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

标签 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;
    }
}

最佳答案

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

数组索引应从0开始到sz

int 函数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,那么它的可访问索引是从0n-1

关于c - 计数排序中与内存相关的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7720632/

相关文章:

c - 将指针添加到指针数组

c - Sizeof 运算符实现 : How it computes size at compile time?

c - Strlen Valgrind 大小 1 的无效读取

c - 使用整数表示排列顺序?

c++ - 来自 std::wstring 的 Asisgn LPCWSTR 数组

Javascript重置数组

php - 创建多个数组并将其关联到变量,无需字符串转换

c - 如何确定我的系统上 malloc() 结果的最小对齐?

c - makefile,工作正常,但即使没有更改也可以运行命令

c - 在 Linux 中使用 fork() 和 exec() 时如何防止创建僵尸进程?