2017-08-27 19 views
1

今、かなり基本的な問題を扱っていますが、なぜ私がフォールトしているのかについて頭を浮かべているようです。 Cプログラミング/メモリの割り当てにまだかなり新しいので、これは非常にシンプルなようだと申し訳ありません。構造体の文字列にメモリを割り当てる

私はメモリを間違って割り当てていると思う、私はちょうどよく分からない。どんな助けも素晴らしいです!

関数におけるemallocがnullチェックと異なるファイル内だけmalloc関数である:構造で

void *emalloc(size_t s) { 
void *result = malloc(s); 
if(NULL == result) { 
fprintf(stderr, "Memory Allocation Failure!"); 
exit(EXIT_FAILURE); 
} 
return result; 
} 


struct htablerec { 
int capacity; 
int num_keys; 
char **keys; 
int *frequency; 

}; 

htable htable_new(int capacity){ 
int i; 

htable htab = emalloc(sizeof *htab); 
htab->capacity = capacity; 
htab->num_keys = 0; 
htab->frequency = emalloc(capacity * sizeof htab->frequency[0]); 

for(i=0; i<capacity; i++){ 
    htab->keys[i] = emalloc((WORD_LEN + 1) * sizeof (char)); 
} 

for(i=0;i< capacity;i++){ 
    htab->frequency[i]= 0; 
    htab->keys[i] = NULL; 

} 
return htab; 
} 
+1

'htab-> keys [i]'を反復する前に 'htab-> keys'にメモリを割り当てなかったかのように、不完全な断片から見えます。 –

+0

これはPHPでも可能ですか - emalloc? – akshayk07

+0

'emalloc'とは何ですか? –

答えて

1

、あなたはcharへのポインタの配列を宣言しています。

char **keys; 

まず、これらのポインタのすべてに1つのメモリを割り当てる前に、これらのポインタに十分な領域を割り当てる必要があります。

htab->keys = malloc(sizeof(char*) * capacity); 

初期化されていないポインタにアクセスしていたため、未定義の動作が発生しました。

+0

emallocはヌルチェック付きの別のファイル内の単なるmalloc関数です:)混乱して申し訳ありません! – Harry

+1

@ハリーあなたの質問を編集して、それを明確にしてください。 –

関連する問題