【问题标题】:Can anyone explain why the address of a pointer change when called by another function? How to make nPtr=Ptr?谁能解释为什么指针的地址在被另一个函数调用时会改变?如何使 nPtr=Ptr?
【发布时间】:2020-12-13 13:56:30
【问题描述】:

我注意到我的指针地址在传递给函数时是不同的。你不确定
访问函数内部存在的值吗?请不要建议从函数中返回指针
值。我严格地想使用 void 函数。

输出:
&nPtr = 6422300
&Ptr = 6422272
&nPtr = 6422300

请参阅以下代码:

#include<stdio.h>

void myFunc(int *Ptr){
    printf("&Ptr = %d\n", &Ptr);
};

void main(){
    int *nPtr;
    printf("&nPtr = %d\n", &nPtr);
    myFunc(nPtr);
    printf("&nPtr = %d\n", &nPtr);
}

让我更清楚。这是我要修复的代码。我想要的只是让两个指针指向同一个地址。我想
使用最佳编码实践。

#include<stdlib.h>
#include<stdio.h>

void myFunc(int *Ptr){
    Ptr = malloc(10*sizeof(int));
    printf("*Ptr = %d\n", *Ptr);
};

void main(){
    
    int *nPtr;
    printf("*nPtr = %d\n", *nPtr);
    
    myFunc(nPtr);
    printf("*nPtr = %d\n", *nPtr);

}

【问题讨论】:

  • myFunc 使用 *Ptr,而 main 使用 int *nPtr。在 main 中尝试 int *Ptr。 nptr 是指向下一个节点的指针
  • 如何使nPtr=Ptr?
  • 您是要制作nPtr==Ptr 还是要制作&amp;nPtr==&amp;nPtr?这是两个完全不同的东西。后者是不可能的,因为它们是两个不同的变量,每个变量都必须有自己的地址。前者您已经拥有,但您在函数中打印&amp;Ptr,而不是Ptr。如果您打印了Ptr,它将与nPtr 相同,但它不会与您在main() 中打印的&amp;nPtr 相同。
  • P.S.您应该使用%p 格式说明符来打印指针。并非所有指针都是ints,有些指针更长。

标签: c


【解决方案1】:

在main() 中,您将在main() 的堆栈帧中获得nPtr 的地址;在myFunc() 中,您将获得nPtr 副本的地址,该地址作为Ptr 按值传递给myFunc()(因此您实际上获得了Ptr 的地址,这是不同的)并存在于myFunc() 的堆栈帧中。

【讨论】:

  • 如何使nPtr=Ptr?
【解决方案2】:

nPtr 和 Ptr 是单独函数中的单独变量,因此每个变量都必须具有不同的地址,即 &amp;nPtr == &amp;Ptr 将始终为 false。

但是您询问了nPtr == Ptr,即它们是否可以包含相同的值,并且作为指针,它们都可以包含相同的指针值。例如:

#include<stdio.h>

void myFunc(int *Ptr){
    printf("Ptr = %p\n", (void *)Ptr);
};

int main(){
    int x;
    int *nPtr = &x;
    printf("nPtr = %p\n", (void *)nPtr);
    myFunc(nPtr);
    printf("nPtr = %p\n", (void *)nPtr);
}

输出:

nPtr = 0x7ffe9a615104
Ptr = 0x7ffe9a615104
nPtr = 0x7ffe9a615104

【讨论】:

    【解决方案3】:

    对于这个功能

    void myFunc(int *Ptr){
        printf("&Ptr = %d\n", &Ptr);
    };
    
    

    当你调用它时,虽然你将一个指针(用于指向一个整数)传递给这个函数,但系统正在创建一个指针的副本,当然它们将位于不同的内存地址。

    因此,当您返回主目录并检索原始指针地址时,它将显示回原始地址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-03
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2019-09-28
      相关资源
      最近更新 更多