我正在学习C.当我遇到分段错误时,我正在编写代码来创建链表。我在this问题中找到了解决问题的方法。 我试图通过引用传递指针。解决方案说我们不能这样做。我们必须将指针传递给指针。这个解决方案对我有用。 但是,我不明白为什么会这样。有人能说出原因吗?
答案 0 :(得分:6)
来自 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
,在第二个示例中您需要传递指向元素指针的指针。