2016-04-23 21 views
0

このコードを実行すると私には "セグメンテーションフォールト"が表示されますが、 "作成"機能の "for"の場合、私は節を設定します(<)プログラムは動作しています、なぜですか?私が望むものをrealloc上のセグメンテーションフォールト

void create(char ***a,int *length){ 
    int i=0; 
    *length = 0; 
    for(i=0;i<4;i++){ 
     ++(*length); 
     (*a)=realloc(*a,(*length)*sizeof(char *)); 
     *(a[i])="Hello\0"; 
    } 
} 

int main(int argc, char *argv[]) { 
    int i; 
    char **a = NULL; 
    int *l = malloc(sizeof(int)); 
    create(&a,l); 
    for (i=0; i<(*l); i++) { 
     printf("%s",a[i]); 
    } 
    printf("\n"); 
    return EXIT_SUCCESS; 
} 

は最後に、プログラムは4回、 "こんにちは"

+2

普通のポインタでない変数として宣言してアドレス演算子を使って渡すのではなく、なぜ 'l'のためにメモリを動的に割り当てるのですか?また、奇妙な、または間違っているいくつかの他のものがあります: "奇妙な"カテゴリでは、必要ではない定数文字列内の明示的な文字列ターミネータの使用と "間違った"部分にポインタを再割り当てあなたは再割り当てしています( 'realloc'が失敗するとどうなるか考えてください)。 –

+1

また、[3つ星のプログラマ](http://c2.com/cgi/wiki?ThreeStarProgrammer)であることを避けるようにしてください。通常、それは褒め言葉ではありません。 –

+1

@JoachimPileborg:だから、このユースケースを 'T *** 'を経由せずに関数の引数でカバーするのですか? – alk

答えて

4

この

*(a[i]) = ... 

(*a)[i] = ... 

である必要があり、私を示すことです"Hello"のような "文字列"リテラル暗黙的には、末尾に'\0'文字を追加します。したがって、を明示的にのように指定する必要はありません。"Hello\0"

関連する問題