2017-04-17 6 views
0
#include "stdio.h" 

struct List { 
    int i; 
}; 

int main() { 
    int c[5] = {3,1,2,5,4}; 
    struct List **list; 
    printf("----%p\n",list); 
    struct List one = {0}; 
    struct List two = {1}; 
    list[0] = &one; 
    list[1] = &two; 
    printf("One: %p\n", list[0]); 
    printf("Two: %p\n", list[1]); 
    return 0; 
} 

結果印刷:Cコードでセグメンテーションフォルトが表示されるのはなぜですか?11ですか?

----0x0 
Segmentation fault: 11 

私はC言語を学びました。ここで何が問題なの?そして、 "int c [5] = {3,1,2,5,4}"の行を削除すると、コードは正常に動作します。それは印刷します。

----0x7fff5d9a99a0  (1 
One: 0x7fff5d9a9978 (2 
Two: 0x7fff5d9a9970 (3 

そして、なぜ

「は、ポインタへのポインタは、」配列として扱うことができ、「2(」から「(1」異なるのアドレスである

+0

'list'が初期化されていない: あなたは10 PTRSの配列のようなものにlist PTを作ることができます。特に指定する場所ではないため、 'list [0]'に値を代入すると、コードは未定義の動作を呼び出します。 –

+0

必要なのは 'struct List * list [2]'です。 –

答えて

4

のあなたはlistに任意のメモリを割り当てられ、それにインデックス演算子を適用すると、未定義の動作が発生していないの配列を作成するなどの

何か。 listへの2つのポインタの配列を割り当てることによって

修正それを:%pで印刷がvoid*を渡す必要があること

struct List **list = malloc(2 * sizeof(List*)); 

注:最後に

printf("----%p\n", (void*)list); 
... 
printf("One: %p\n", (void*)list[0]); 
printf("Two: %p\n", (void*)list[1]); 

は、あなたはあなたが一度ポインタを解放する必要がありますメモリリークを避けるために行われました。

free(list); 
return 0; 
1

通報しますか??で、これに起因する - その後、

struct List **list; // <--- not initialized 

これらの文 -

printf("----%p\n",list); 
//your code 
list[0] = &one;    
list[1] = &two; 

未初期化された動作を引き起こす初期化されていないポインタを参照解除し、結果としてセグメント化エラーが発生します。

メモリをに割り当て、malloc(またはcalloc)を使用して値を格納します。

1

これは、これらの2行のためか、むしろ最初の1行だからです。

list[0] = &one; 
list[1] = &two; 

これを参照するには、listのメモリを割り当てる必要があります。

list = malloc(sizeof(*list) * 100); //for 100 list items 

またはその代わりにポインタ

struct List *list[100]; //for 100 list items 
1

listは決して初期化されず(ランダムなデータがスタック上にある場合はいっぱいになります)、このランダムデータはlist[0]list[1]を介してptrとして参照解除されます。

struct List **list = (struct List **) malloc(10*sizeof(struct List*)); 
関連する問題