函数内打印出不同的指针地址

5

我对C语言和指针不是很熟悉。以下是我尝试编写的一些代码。

struct node{
    struct node * next;
    struct node * prev;
    int num;
 };

 void func(struct node * leaf , struct node ** add_leaf){
     printf("function starts");
     printf("&leaf = %p  add_leaf = %p\n" , &leaf , add_leaf);
     printf("leaf = %p  *add_leaf = %p\n" , leaf , *add_leaf);
     printf("function over");
     return
 }


 void main(){
     struct node * leaf = (struct node*)malloc(sizeof(struct node));
     printf("leaf = %p\t&leaf = %p\n" , leaf , &leaf);
     func(leaf , &leaf);
 }

leaf和*add_leaf的值相等,这正是我所期望的。然而,当在函数内部打印它们的值时,我无法理解为什么&leaf和add_leaf的值不同。在这里,我试图打印节点指针leaf的地址。


谢谢,已经做出更改。 - user3663685
3个回答

3

main中的局部变量leaf在调用func时被复制。这意味着,func内部的局部变量leafmain内部的leaf具有相同的值,即它指向相同的内存地址(因此第二个检查等价),但它本身存储在不同的地址。


1
由于这种方式,参数变成了局部变量。因此,如果您想将其中一个参数视为其他许多语言所称的“inout”或类似的东西——即您可以修改它并使该修改影响到调用范围中提供的值——则需要添加额外的间接级别,并通过指针引用进行修改。这就是为什么您的代码将leaf作为指针传递的部分原因:以便它可以修改所指向的内容,使得修改不仅局限于本地且不会随时消失。 - Tommy

2

如果你用箭头和方框画一幅图,往往更容易理解指针。

&leaf 给出了变量 leaf 的地址,由于你有两个名为 leaf 的不同变量(都包含指向 malloc 分配的结构体的指针),因此你会得到两个不同的地址:

enter image description here


0

leaf 是一个指向 struct node 的指针,而指针是一个存储在内存中的 32 位(根据架构而定)整数。

当你将 leaf 传递给 printf 时,会在堆栈上制作 leaf 变量的副本。该副本对应于 printf 函数的第二个本地参数。

但是当你将 &leaf 传递给 printf 函数时,所做的是传递 leaf 变量的地址。

由于 main() 中的 leaf 变量和 printf 的第二个参数位于两个不同的位置,因此它确实会打印出两个内存地址。


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