2016-11-14 8 views
-1

私は配列char *Input[11]を持っています。私はそれにメモリを割り当てるのにmalloc()を使います。malloc()の後で配列にアクセスすると突然セグメント化エラーが発生する

for(int i = 0; i < 12; i++) 
     Input[i] = "\0"; 

    for(int i = 0; i < 12; i++) 
    { 

     Input[i] = malloc(256 * sizeof(char)); 
    } 

    for(int i = 0; i < 12; i++) 
    { 
     strcpy(Input[i], "test"); 
    } 

    printf("Input[11] is %s\n", Input[11]); // <- Here the seg fault happens 

私が後でInput[11]にアクセスしたい場合、セグメンテーションフォルトが発生します。 Input[11]が指し示すものがない場合は、通常、このエラーが発生することがありますので、メモリの割り当て方法に問題があると思います。 Input[10]以下にアクセスすると問題ありません。私はvalgrindのとそれをチェックし、それはエラーメッセージです:しかし、私は本当にこれはエラーがどこにあるのを除いて私に語ったのかわからないんだけど

==5633== 1 errors in context 1 of 1: 
==5633== Invalid read of size 1 
==5633== at 0x4098383: vfprintf (vfprintf.c:1632) 
==5633== by 0x409D695: printf (printf.c:33) 
==5633== by 0x8048A15: handle_command (swebsh.c:122) 
==5633== by 0x8048BE6: main (swebsh.c:181) 
==5633== Address 0x6e69622f is not stack'd, malloc'd or (recently) free'd 

。どんな助けもありがとうございます。

編集:おっと、コードを簡素化するときに初期設定を忘れてしまいます。

+0

Unsimplifyそれいくつかのより多くを書き換えることができます。 'Input'はどのように定義されていますか?人々の回答を無効にする方法でコードを編集するのではなく、まず[MCVE](http://stackoverflow.com/help/mcve)を投稿してください。 – StoryTeller

+0

これを読んでくださいhttps://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – StoryTeller

+0

私は答えにコメントを投稿するつもりでしたが、削除されました。 2回目の編集を試み、それが役立つかどうかを確認します。 –

答えて

2

配列にN個の要素がある場合、有効なインデックス範囲は[0, N-1]です。コードスニペットでは、配列を11要素として宣言しました。したがって、配列の有効なインデックス範囲は[0, 10]です。

この種のエラーを回避するには、マジックナンバーを使用しないでください。その代わりにいくつかの名前を使用してください。

あなたのコードは次のよう

#define N 11 

//... 

char *Input[N] = { 0 }; 
int length = 256; 

for(int i = 0; i < N; i++) 
{ 
    Input[i] = malloc(length * sizeof(char)); 
} 

for (int i = 0; i < N; i++) strcpy(Input[i], "test"); 

printf("Input[N - 1] is %s\n", Input[N - 1]); 
+0

ありがとうございます! –

+0

@Yíu全くありません。どういたしまして。:) –

関連する問題