2017-09-29 28 views
1

*a[1]=1;のsegfaultエラーは、mallocを使用してヒープ上にすでにスペースを割り当てていますが、どうしてですか?動的配列のsegフォールト

void d(int **a, int count){ 
    *a = malloc(sizeof(int)*count); 
    *a[1]=1; 
} 

int main(){ 
    int count =10; 
    int *a; 
    d(&a, count); 
} 
+1

両方の回答が正しい方向に向いています。 *オペレータの優先順位。それはあなたが学ばなければならないものの1つです(残念なことに、ほとんどのチュートリアルで省略されています) –

答えて

2

あなたの代入操作*a[1]=1operator precedence rulesによると、*(a[1])=1と同等です。あなたが最初の、そしてインデックス1 その後、アクセス要素間接参照aする場合は、あなたの意図を明確にするために括弧を含める必要があります。(*a)[1]=1

4

*a[1] = 1;は、あなたがそれをやっていると思うものをそうやっていません。インデクシング用の括弧は逆参照よりも優先順位が高いので、整数へのポインタの配列としてaを扱っているかのように考えることができ、逆参照する前に2番目の要素にアクセスしようとすると、整数の配列へのポインタではなく、これは当てはまらないので、その位置で逆参照される可能性のある不良アドレスが存在する可能性があるため、セグメンテーションが失敗します。

ただし、(*a)[1] = 1;に変更すると、ポインタが最初に参照解除され、割り付けたメモリが適切にインデックスされます。

+0

あなたは正しいです - ありがとう! – onezeroonefive

関連する問題