2017-02-15 2 views
0

여기 내 문제가 있습니다. 다음 컴파일 가능한 코드는 단순히 디버깅과 달리 실행될 때 다른 결과를 생성합니다. Cygwin 도구가있는 Windows 10에서 NetBeans IDE 8.0.2를 gdb 디버거와 함께 사용합니다.c - 알파벳순 알파벳순 : 실행시와 디버깅시의 출력이 다릅니 까?

[JACUZZI] 
[A] : 1 
[C] : 2 
[I] : 3 
[J] : 4 
[U] : 5 
[Z] : 6 
[Z] : 7 

:

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

int exists(int* arr, int len, int i) { 
    for (int j = 0; j < len; j++) { 
     if (arr[j] == i) { 
      return 1; 
     } 
    } 

    return 0; 
} 

int* alpha_order(char* source, int len) { 
    int* pos = malloc(sizeof(int) * len); 

    char c = SCHAR_MAX; 
    int cpos = 0; 

    for (int i = 0; i < len; i++) { 
     for (int j = 0; j < len; j++) { 
      if ((c > *source) && (exists(pos, len, j) != 1)) { 
       c = *source; 
       cpos = j; 
      } 

      source++; 
     } 

     source -= len; 
     c = SCHAR_MAX; 

     pos[i] = cpos; 
    } 

    return pos; 
} 

int main(void) { 

    char* str = "JACUZZI"; 
    int len = strlen(str); 

    int* pos = alpha_order(str, len); 

    printf("[%s]\n", str); 

    for (int i = 0; i < len; i++) { 
     printf("[%c] : %d\n", str[pos[i]], (i + 1)); 
    } 

    return 0; 
} 

내가 여기 기대하고있어 나는 성공적으로 내가 (라인 pos[i] = cpos;에 중단 점 등으로) 프로젝트를 디버깅 할 때마다 얻을 수있어 다음과 같은 결과이며,

[JACUZZI] 
[A] : 1 
[C] : 2 
[I] : 3 
[U] : 4 
[Z] : 5 
[Z] : 6 
[Z] : 7 

내가 내 코드에서 메모리 관리에 문제가 의심 그러나, 난 그냥 프로젝트를 실행할 때, 이것은 내가 얻을 잘못된 출력됩니다. 이것은 C를 처음 시도한 것으로, Java (가비지 콜렉션 포함)에 익숙합니다. 따라서 문제가 무엇인지 알기가 매우 힘듭니다. 특히 프로젝트를 디버깅 할 때 모든 단계에서 원하는 결과를 얻는 것이 중요합니다.

내가 작성한 알고리즘은 문자열 (char* 배열)을 반복하여 최소값을 찾고 int* 배열에 저장합니다. int* 어레이는 이미 고려한 위치를 확인하는데도 사용됩니다. 이것은 문자열의 모든 문자에 대한 위치가 int* 배열에 저장 될 때까지 반복됩니다.

최종 출력은 주어진 문자열의 문자 사전 순입니다. 저는 시간 복잡성이 O (n^3)라고 생각합니다. 동일한 결과를 얻는 더 효율적인 방법이있을 수 있다는 것을 알고 있습니다.하지만 나는 일반적으로 C에 익숙해 져 있습니다. 걸음마.

이 문제를 해결하려면 C에서 다차원 배열 (및 포인터)에 접근 할 때 유용합니다. 코딩을 통해 학습하는 것을 선호하지만 필자도 책을 가지고 있습니다. 예 : 이 알고리즘은 원주 형 전치 인코더/디코더의 구현에 적용될 수있다. 따라서 코드에서 잘못된 코딩 방법을 지적 할 수 있다면 알려주십시오. 즉, 디버거를 벗어나는 문제를 찾는 데 도움이되는 답변을 중요하게 생각하며 다음에 무엇을 시도해야할지 모르겠습니다.

감사합니다.

+0

왜'char c = CHAR_MAX;'대신'char c = SCHAR_MAX; – chux

+1

'exists (pos, len, j)'는'len'의 길이에 대해'pos []'를 검색하지만 아직 모든 요소가 할당되지는 않습니다. – chux

+0

그게 다야! 두 개의 for-loop 내에서 반복을 추적하기 위해 또 다른 변수'int k = 0; '을 만들었고, 위치가'pos *'에 저장 될 때마다 증가합니다. 프로그램이 의도대로 작동하지만 디버거에서이 문제점을 찾을 수없는 이유가 있습니까? –

답변

0

귀하의 의견의 깊이에서 발견 한 바와 같이 여기서 문제는 프로그램이 초기화되지 않은 값을 사용하고 있다는 것입니다.

디버거가 malloc 메모리를 0으로 만들었을 것입니다. 릴리스/프로덕션 용으로 컴파일 할 때와 같이 0이 멀리 떨어져 최적화 될 것입니다.

또 다른 잠재적 인 솔루션을 제외하고 당신이 만든과제의 수를 추적하고 명시 적으로 제로 pos 직접 할당 한 후 (예를 들어 memset(pos, '\0', sizeof *pos * len)를) exists(pos, len, j)len 대신에,했을 것을 사용하거나 같은 calloc를 사용에서 이것은 당신을 위해 영점을 수행합니다.

+0

이것은 동작의 차이점을 설명합니다. 감사! 나는 아직도 배울 것이 많다. 나는 메모리 블록을 초기화하지 않는 malloc에 ​​대해서조차 생각조차하지 않았다. –