2016-11-21 3 views
0

문자열에서 가장 작은 ASCII 코드를 가진 char을 찾고 출력합니다. 내 문제는 메시지에 있습니다 : 분할 오류 (코어 덤프). 왜 그리고 어디에서 발생합니까? 감사합니다.분할 오류 (코어 덤프) - 내 코드를 수정하는 방법?

NULL 포인터 역 참조
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  

int main(void) {  

char* str = NULL;  
int* mincode = NULL;  
int* count = NULL;  
char* mincodeChar = NULL; 


str = (char *) malloc(50 * sizeof(char)); 
mincode = (int *) malloc(1 * sizeof(int)); 
count = (int *) malloc(1 * sizeof(int)); 

if (NULL == str || NULL == mincode || NULL == count){ 
     printf("Alloc error"); 
     return EXIT_FAILURE; 
    } 

fgets(str, 50, stdin); 

printf("your string: "); 
puts(str); 

*mincode = (int)(str[*count]); 
*mincodeChar = *(str + *count); 

for (*count = 0; str[*count] != '\0'; (*count)++) { 

    if((int)str[*count] < (*mincode)) { 
    (*mincode) = (int)str[*count]; 
    mincodeChar = (str + *count); 
    printf("%c", *mincodeChar); 
    } 
} 

printf("your character: "); 
printf("%c", *mincodeChar); 

free(str); 
free(mincode); 
free(count); 

return EXIT_SUCCESS; 
} 
+1

컴파일 타임 고정 크기가되었을 때 메모리를 동적으로 할당하는 이유는 무엇입니까? 특히, * one *'int'에 메모리를 할당하는 이유는 무엇입니까? 왜 간단한'int' 변수를 사용하지 않을까요? –

+2

1) * mincode = (int) (str [* count]);':'* count'는 초기화되지 않습니다. – BLUEPIXY

+0

[malloc의 결과 캐스팅에 대한이 토론] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)도 참조하십시오. –

답변

4
char* mincodeChar = NULL; 
.... 
*mincodeChar = *(str + *count); 

당신이 .

교훈이이 걸릴 수 있습니다 :

  1. 항상 가능한 한 빨리 유효한 값으로 당신에게 변수를 초기화합니다.
  2. 역 참조하기 전에 포인터를 확인하십시오.
+0

하지만 mincodeChar = (str + * count)가 있습니다. 그런 다음 mincodeChar를 참조 해제합니다. 어쨌든 작동하지 않는 이유는 무엇입니까? 문제가 발생합니까? – Sergei

+0

@Sergei,'* mincodeChar = * (str + * count); **는 ** mincodeChar = (str + * count)와 동일하지 않습니다.첫 번째는 뾰족한 값에 액세스하고 두 번째는 포인터에 액세스합니다. – StoryTeller

0

확인하지 않았하지만

*mincode = (int)(str[*count]); 
*mincodeChar = *(str + *count); 

하지 초기화 된 값을 포함합니다. 그래서 0과 같을 수도 있습니다. 492892911039 ... 초기화되지 않은 변수의 무작위성을 이해하지 못했습니다. 그리고이 경우에 492892911039의 위치를 ​​열려고합니다 .... SIGSEGV? 0을 원한다면 명시 적으로 0으로 설정하거나 malloc()을 호출하여 calloc()을 호출하십시오. 그렇다면 다른 변수들과 동일합니다 ... 왜 당신은 하나의 변수를 할당합니까? ... 일어날 수 있지만 외국 제약에 대한 것입니다. 예를 들어 무효화 만 허용하는 API 함수를 호출 할 때입니다. 그러나 피할 수있는 경우 더 나은 피할 수 있습니다. 게으름뿐만 아니라 malloc의 대부분의 구현은 list입니다. 따라서 할당 할 때마다 새로운 할당마다 점수를 매겨야하는이 목록이 더 오래 할당됩니다. 그래서 약간 malloc() 속도가 느려집니다. 물론이 경우에는 ... 그러나 작은 메모리 블록을 할당하는 것보다 훨씬 적은 메모리 블록을 할당하는 것이 더 편리합니다.