【问题标题】:Checking pointer address and value from a function从函数检查指针地址和值
【发布时间】:2014-12-22 19:58:52
【问题描述】:

我是 C 初学者,一直在阅读一本名为“理解和使用 C 指针”的书,结果在使用 printf 函数时遇到了问题。

使用 debug_p 时,发现指针 num_p 的地址与 debug 中的 num 不同,但在 main() 中尝试 printf 时返回正确的值。

我的问题是,为什么会这样?是否有适当的方法在函数中执行 printf 并具有正确的指针地址?

#include <stdio.h>
void debug(int num)
{
    printf("Address of num: %i Value: %i\n", &num, num);
}

void debug_p(int *num_p)
{
    printf("Address of num_p: %i Value %i\n", &num_p, num_p);

}


int main()
{
int num=11;
int *num_p=&num;
printf("Address of num: %i Value: %i\n", &num, num);
printf("Address of num_p: %i Value: %i\n\n", &num_p, num_p);

debug(num);
debug_p(num_p);
return 0;
}

main() 的输出:

Address of num: 2358860 Value: 11
Address of num_p: 2358848 Value: 2358860

从调试输出,然后是 debug_p:

Address of num: 2358816 Value: 11
Address of num_p: 2358816 Value 2358860

【问题讨论】:

  • 使用%p 打印变量的地址。
  • 我给了你一个答案,但我不确定它是否涵盖了你的实际问题。你能改写一下吗?我愿意帮助你,但我不明白你的问题是什么。
  • 我目前的问题是我不完全理解为什么 debug_p 中的 num_p 的值在调试时没有指向 num 的地址,但是在 main 中这样做就很好了。您的回答很清楚,但绝对不是很直观。
  • 好的,我知道了。我会给你另一个答案,因为它实际上与我迄今为止回答的不同(尽管如此)。
  • 函数内部的numnum_p是副本,按值传递,与函数外部定义的变量不同。

标签: c function pointers


【解决方案1】:

当你将一个变量传递给一个函数时,你只传递了这个变量的。您永远不会传递地址,因为在该函数中创建了一个 new 变量。您在函数签名中看到的参数都是局部变量,就像您将它们写在函数体中一样。这些参数填充了您在调用函数时传递的值 - 但同样,您只是将值传递给 new 变量。

void function(int a) { printf(a); }

int a = 5;
function(a);

在此示例中,存在两个具有完全不同地址的不同变量。它们只是具有相同的(即 5),但它们的地址却大不相同。

同样的情况发生在你的调试函数中:num 中的变量与 main 中的 num 不同,它们只是具有相同的 (因为你“给”了main 中的 num 的值到 debug 中的 num),但地址不同。现在由于debug_p 中的num_p 仍然指向main 中的numdebug 中的num 不是,因此地址不同。

【讨论】:

    【解决方案2】:

    numnum_p 在两个函数中的地址相同的原因在于堆栈的工作方式:第一次调用debug 在堆栈上分配一个变量。然后,当函数返回时,堆栈再次被释放。现在您调用debug_p,因此分配了另一个变量。它将使用与以前相同的内存位置,因为堆栈是以相同的方式构建的。

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多