我正在学习C语言。在编写创建链表的代码时,遇到了一个分段错误。我在这个问题中找到了解决方案。我试图通过引用传递指针,但是解决方案说我们不能这样做。我们必须传递指向指针的指针。这个解决方案对我有效。但是,我不明白为什么会这样。有人能告诉我原因吗?
我正在学习C语言。在编写创建链表的代码时,遇到了一个分段错误。我在这个问题中找到了解决方案。我试图通过引用传递指针,但是解决方案说我们不能这样做。我们必须传递指向指针的指针。这个解决方案对我有效。但是,我不明白为什么会这样。有人能告诉我原因吗?
来自《C程序设计语言第二版》(K&R 2):
5.2 指针和函数参数
由于C语言通过值传递参数给函数,所以被调用的函数无法直接修改调用函数中的变量。
...
指针参数使得一个函数能够访问和改变调用它的函数中的对象。
如果您理解了上述内容:
void fn1(int x) {
x = 5; /* a in main is not affected */
}
void fn2(int *x) {
*x = 5; /* a in main is affected */
}
int main(void) {
int a;
fn1(a);
fn2(&a);
return 0;
}
出于同样的原因:
void fn1(element *x) {
x = malloc(sizeof(element)); /* a in main is not affected */
}
void fn2(element **x) {
*x = malloc(sizeof(element)); /* a in main is affected */
}
int main(void) {
element *a;
fn1(a);
fn2(&a);
return 0;
}
int
和元素指针之间没有区别,在第一个示例中,您需要传递指向int
的指针,在第二个示例中,您需要传递指向元素指针的指针。