2016-11-21 4 views
0

Программа находит символ с наименьшим кодом ascii в строке и выводит его. Моя проблема заключается в сообщении: Ошибка сегментации (сбрасывание ядра). Почему и где это происходит? Спасибо за внимание.Ошибка сегментации (сбрасывание ядра) - как исправить мой код?

#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) at '* 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); 

Вы разыменования указателя NULL.

Уроки извлечь из этого:

  1. Всегда инициализировать вам переменные значения действует как можно скорее.
  2. Проверка указателей перед разыменованием.
+0

, но есть mincodeChar = (str + * count); а затем i разыменовать 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, которые принимают только void * ... но когда можно избежать, лучше избегать. Не только для ленивости. Большинство реализаций malloc являются list.So больше вы выделяете более длинный становится этот список, который при каждом новом распределении должен быть забит. Так что это немного замедляет ваш malloc(). Разумеется, в этом случае ... но лучше выделять несколько больших блоков памяти, а не много.

Смежные вопросы