动态阵列中的seg故障(C)

动态阵列中的seg故障(C),c,malloc,C,Malloc,为什么我得到一个segfault错误,因为*a[1]=1即使我已经用malloc在堆上为它分配了空间 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相当于*(a[1])=1。如果您打算先取消引用a,然后访问索引1处的

为什么我得到一个segfault错误,因为
*a[1]=1即使我已经用malloc在堆上为它分配了空间

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
相当于
*(a[1])=1
。如果您打算先取消引用
a
,然后访问索引1处的元素,则应包括括号以明确您的意图:
(*a)[1]=1
根据,您的赋值操作
*a[1]=1
相当于
*(a[1])=1
。如果您打算先取消引用
a
,然后访问索引1处的元素,则应包括括号以明确您的意图:
(*a)[1]=1
*a[1]=1
可能没有执行您认为它正在执行的操作。由于用于索引的括号的优先级高于解引用,因此可以将其视为将
a
视为指向整数的指针数组,并在解引用之前尝试访问其第二个元素以获取其指向的整数,而不是指向整数数组的指针。由于情况并非如此,因此可能会出现错误,因为可能存在一些错误的地址,然后在该位置取消引用


但是,如果您将其更改为
(*a)[1]=1,指针首先被解除引用,并且分配给它的内存被正确索引。

*a[1]=1
可能没有执行您认为它正在执行的操作。由于用于索引的括号的优先级高于解引用,因此可以将其视为将
a
视为指向整数的指针数组,并在解引用之前尝试访问其第二个元素以获取其指向的整数,而不是指向整数数组的指针。由于情况并非如此,因此可能会出现错误,因为可能存在一些错误的地址,然后在该位置取消引用


但是,如果您将其更改为
(*a)[1]=1,指针首先被解除引用,分配给它的内存被正确索引。

两个答案都指向正确的方向。运算符优先级。这只是你必须学习的东西之一(不幸的是,大多数教程都忽略了这一点),这两个答案都为你指明了正确的方向。运算符优先级。这只是你必须学习的东西之一(不幸的是,大多数教程都忽略了这一点)