2017-10-03 10 views
-1

나는 C에서 quicksorting 알고리즘을 쓰고있어 내 터미널에 bus error:10 계속 받고있어. 이 특정 경우에 어떻게 확신 할 지 모르지만 배열에 메모리를 할당해야한다는 것을 이해합니다.C 버스 오류 : 10 문자열 배열을 사용하여

편집 : 나는 더 많은 정보없이 quicksort, partitioningswap 기능

void swap(char* a, char* b){ 

int temp = *a; 
*a = *b; 
*b = temp; 
} 

int partitioning(char* A, int start, int finish){ 

    char* pivot = &A[start]; 

    while(1){ 

     while(strcmp(&A[start], pivot) < 0){ 
      start++; 
     } 
     while(strcmp(&A[finish], pivot) > 0){ 
      printf("Decrementing finish\n"); 
      finish--; 
     } 
     if(start >= finish){ 

      return start; 
     } 
     swap(&A[start], &A[finish]); 
    } 
    return start; 
} 

void quicksort(char* A, int start, int finish){ 


if(start < finish){ 

    int p = partitioning(A, start, finish); 
    quicksort(A, start, p); 
    quicksort(A, p+1, finish); 
    } 
} 
int main() 
{ 
    char *A[] ={"Thomas","Carl","Sabrina","Noam","Alex", 
       "Victoria","Julia","Audrey","Elon","Liam","Rebecca"}; 
    int n = 11; 
    for (int i = 0; i < 11; i++) 
    { 
     printf("%s ", A[i]); 
    } 

    quicksort(*A, 0 , n-1); 

    printf("\n-------\n after sort\n------\n"); 
    for (int i = 0; i < 11; i++) 
    { 
     printf("%s ", A[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
+3

'char * A [] = {... 문자열 리터럴의 목록 ...}'은'const'없이 실수로 경고하는 것은 매우 위험합니다. 또한,'quicksort()'를 게시하십시오. –

+1

실제 정렬 기준은 어디에 있습니까? 정렬 알고리즘에 일반 데이터의 임의의 덩어리를 던져서 정렬하는 방법을 알기를 기대할 수는 없습니다. – Lundin

+0

'A'는 각 요소가 널 종료 문자열을 가리키는'char *'배열입니다. 'A '의 원소를 가리키는 문자열을 비교하여'A'를'A '를'A'와 같이'quicksort'에 넘겨주는 것은 의미가 없다고 가정합니다. 'A [0]'이 아니라'A '를 정렬하기를 원하기 때문에'A '를'quicksort'에 전달해야하며, 형식 매개 변수는'char **'유형이어야합니다. –

답변

0

,주의해야 A 대신 A[0]을 정렬하려고했습니다. 수정 된 코드는 다음과 같습니다 :

#include <stdio.h> 
#include <string.h> 

void swap(char** a, char** b){ 

    char* temp = *a; 
    *a = *b; 
    *b = temp; 
} 

int partitioning(char** A, int start, int finish){ 

    int pivot = start; 

    while(1){ 

     while(strcmp(A[start], A[pivot]) < 0){ 
      start++; 
     } 
     while(strcmp(A[finish], A[pivot]) > 0){ 
      finish--; 
     } 
     if(start >= finish){ 

      return start; 
     } 
     swap(&A[start], &A[finish]); 
    } 
    return start; 
} 

void quicksort(char** A, int start, int finish){ 

    if(start < finish){ 

     int p = partitioning(A, start, finish); 
     quicksort(A, start, p); 
     quicksort(A, p+1, finish); 
    } 
} 

int main() 
{ 
    char *A[] ={"Thomas","Carl","Sabrina","Noam","Alex", 
       "Victoria","Julia","Audrey","Elon","Liam","Rebecca"}; 
    int n = sizeof(A)/sizeof(A[0]); 
    for (int i = 0; i < n; i++) 
    { 
     printf("%s ", A[i]); 
    } 

    quicksort(A, 0 , n-1); 

    printf("\n-------\n after sort\n------\n"); 
    for (int i = 0; i < n; i++) 
    { 
     printf("%s ", A[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
0

을 추가 한, 당신은 그래서 당신이 정보를 손실 quicksort()에 역 참조 후 A를 전달합니다.

는 사실, 호출이 quicksort()이 실제로 무엇을하고 있는지에 따라

quicksort(A[0], 0, n - 1); 

에 해당의 SIGBUS의 원인은 내 거짓말을해야하지만, 당신이 그것을 게시하지 않았다. 그럼에도 불구하고 당신의 문제는 분명히 지적입니다. 당신이 그들을 이해하지 못하는 것 같습니다. AA[0]의 어드레스가 동일하기 때문에

I가 quicksort(A[0], 0, n - 1) 인해 이전 단락에서 표현 된 문제의 문제를 일으키는 것으로 주장하지 않는 이유이며, 차이점은 수행 된 포인터를 arithmetics에 놓여 이 둘은 포인터 유형이 같지 않습니다. 이 정의되지 않은 동작, 그것은이 같은 const을 사용하는 일을 실수 방지하는 방법 중 하나이기 때문에이를 수정하지 문자열 리터럴를 사용하는 경우

또한

, 당신은 주요 문제가

const char *A[] = { ... /* String Literals Here */ ... };