动态数组中的seg故障(C)

时间:2017-09-29 22:10:57

标签: c malloc

为什么我为*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);
}

2 个答案:

答案 0 :(得分:5)

*a[1] = 1;可能没有按照您的想法行事。由于索引的括号具有比解除引用更高的优先级,因此您可以将其视为将a视为指向整数的指针数组并尝试在取消引用以获取整数之前访问它的第二个元素指向,而不是指向整数数组的指针。由于情况并非如此,因此可能存在一些不良地址,然后在该位置被取消引用。

如果您将其更改为(*a)[1] = 1;,则首先取消引用指针,并将您分配的内存正确索引。

答案 1 :(得分:2)

根据operator precedence rules,您的作业操作*a[1]=1相当于*(a[1])=1。如果您打算首先取消引用a,然后然后访问索引1处的元素,则应该包括括号以明确您的意图:(*a)[1]=1