*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);
}
*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);
}
あなたの代入操作*a[1]=1
はoperator precedence rulesによると、*(a[1])=1
と同等です。あなたが最初の、そしてインデックス1 その後、アクセス要素間接参照a
する場合は、あなたの意図を明確にするために括弧を含める必要があります。(*a)[1]=1
*a[1] = 1;
は、あなたがそれをやっていると思うものをそうやっていません。インデクシング用の括弧は逆参照よりも優先順位が高いので、整数へのポインタの配列としてa
を扱っているかのように考えることができ、逆参照する前に2番目の要素にアクセスしようとすると、整数の配列へのポインタではなく、これは当てはまらないので、その位置で逆参照される可能性のある不良アドレスが存在する可能性があるため、セグメンテーションが失敗します。
ただし、(*a)[1] = 1;
に変更すると、ポインタが最初に参照解除され、割り付けたメモリが適切にインデックスされます。
あなたは正しいです - ありがとう! – onezeroonefive
両方の回答が正しい方向に向いています。 *オペレータの優先順位。それはあなたが学ばなければならないものの1つです(残念なことに、ほとんどのチュートリアルで省略されています) –