2011-10-11 2 views
0

저는 계산 방식을 구현하려고 노력해 왔습니다.정렬 관련 메모리 관련 오류가 있습니까?

사용자가 프로그램을 실행해야하는 횟수 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; 
    } 
} 

답변

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한다이다.