2012-01-28 9 views
0

次のコードが動作することが期待されます。コンパイルすると(gcc)、実行はSegmentation fault: 11になります。どうして?おかげ文字列のCセグメント化エラー

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAX_INDEX_LENGTH 20 

main() 
{ 
    char **indici; 
    int n = 4; 

    indici = (char **)malloc(n * sizeof(char*)); 
    int i; 
    for (i = 0; i < n; i++) 
    { 
     indici[i] = (char *)malloc(MAX_INDEX_LENGTH * sizeof(char*)); 
    } 

    strncpy(indici[0], "aaa", MAX_INDEX_LENGTH); 
    strncpy(indici[0], "bbbb", MAX_INDEX_LENGTH); 
    strncpy(indici[0], "ccccc", MAX_INDEX_LENGTH); 
    strncpy(indici[0], "ddddddd", MAX_INDEX_LENGTH); 

    for (i = 0; i < n; i++) 
    { 
     printf("Index %d is %s\n", n, indici[n]); 
    } 
} 
+0

有用な回答がまだ投稿されていますが、実際に私が推測したいものであるMAX_INDEX_LENGTH * sizeof(char)の代わりにMAX_INDEX_LENGTH * sizeof(char *)を割り当てていることを指摘したいと思います。 –

答えて

1

あなたは[0] indiciにすべての文字列をコピーしているので、他の3が初期化されていないです。

初期化されていないものを印刷すると、kaboomが印刷されます。

2

あなたはすべての要素を移入していないが、唯一のindici[0]ので、初期化されないままとゴミにそうポイント。したがって、2番目のforが実行されると、初期化されていないものが参照解除されます。

はたぶん、あなたは意味:

strncpy(indici[0], "aaa", MAX_INDEX_LENGTH); 
strncpy(indici[1], "bbbb", MAX_INDEX_LENGTH); 
strncpy(indici[2], "ccccc", MAX_INDEX_LENGTH); 
strncpy(indici[3], "ddddddd", MAX_INDEX_LENGTH); 

第二の問題は、あなたが割り当てられたメモリの外にあるindici[n]を印刷しようとしているということです。

(char *)malloc(MAX_INDEX_LENGTH * sizeof(char*)); 
             ^^^^^^ 

あなたはあなたが必要以上を割り当てている:あなたは、おそらく別の微妙な問題はこれです

printf("Index %d is %s\n", i, indici[i]); 

を意味しました。あなたは多くの文字を割り当てなければならないので、それはsizeof(char)でなければなりません。しかしsizeof(char)は常に1あるので、それは次のようになります。

malloc(MAX_INDEX_LENGTH); 
+0

これを実行しようとすると、クラッシュすることもあります。 OPには最後のループで問題があります。 – taskinoor

+0

うん、私はちょうど気づいて、答えを編集、ありがとう:-) – cnicutar

関連する問題