2016-11-21 11 views
0

プログラムは、文字列中の最小のアスキーコードを持つcharを見つけて出力します。私の問題はメッセージにあります:セグメンテーションフォルト(コアダンプされた)。なぜ、どこで起こりますか? ご注意いただきありがとうございます。セグメンテーションフォールト(コアダンプ) - コードを修正するには?

#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

)* 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)があります。 mincodeCharを逆参照します。なぜそれはとにかく働かないのですか?それは問題を引き起こすか? – Sergei

+0

@Sergei、 '* mincodeChar = *(str + * count); **は** mincodeChar =(str + * count);と同じではありません。最初の値はポインティング値にアクセスし、2番目の値はポインターにアクセスします。 – StoryTeller

0

はチェックしませんでしたが、

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

は初期化されていない値が含まれています。だから、おそらく492892911039のように0にすることができます...初期化されていない変数のランダム性を決して理解できませんでした。そしてこの場合、あなたは492892911039でポジションを開こうとしています.... SIGSEGV? 0を明示的に設定したい場合は0に設定するか、malloc()を呼び出してcalloc()を呼び出します。それでは他の変数と同じ...なぜあなたは単一の変数を割り当てますか? ...それは起こり得るが、外国の制約のためであり、例はvoid *を受け入れるAPI関数をいくつか呼び出すときである...しかし避けることが可能な場合は避けるほうがよい。怠け者だけでなく、 mallocのほとんどの実装はリストです。割り当てを増やすと、新しい割り当てごとにスコアを付けなければならないこのリストになります。だから少しそれはあなたのmalloc()を遅くする。このケースでは当然です...しかし、ずっと小さなメモリブロックではなく、小さなブロックを割り当てようとしています

関連する問題