C指针异常,请解释说明。

6

我有一个函数,函数的基本思想是改变指向 a 的内容。第一个版本可以工作,但是第二个版本无法工作。

能有人帮我理解这里发生了什么吗?

// this works
void swap(int **a) {
    int *temp = malloc(sizeof(int) * 3);
    temp[0] = 0;
    temp[1] = 1;
    temp[2] = 2;
    *a = temp;
}

// this does not
void swap(int **a) {
    *a = malloc(sizeof(int) * 3);
    *a[0] = 0;
    *a[1] = 1; // seg fault occurs on this line
    *a[2] = 2;
}

我这样调用函数:

int main() {
   int b[] = {0,1};
   int *a = b;

   swap(&a);

   return 0;
}

此外,这两个函数不能同时存在于同一个文件中。

你在第二个函数中做了非常错误的事情。 - wRAR
为什么要用与参数相同的名称命名新变量? - FELIPE_RIBAS
在此发布时,在第二个swap函数中重新声明int数组是一个疏忽。我已经从问题中删除了它。 - robbmj
1个回答

14
< p > < code >[] 的优先级高于 < code >* (事实上,在 C 中,< code >[] 具有最高的优先级)。这意味着您的表达式是 *(a[0]) 而不是您想要的 (*a)[0]


我不确定 (*a)[0] 是否有意,因为 *a 无法进行下标操作。 - wRAR
谢谢Ben,这解决了问题,还感谢你附带的解释。 - robbmj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接