【问题标题】:Pointer as function argument receives memory address (C)指针作为函数参数接收内存地址 (C)
【发布时间】:2015-03-09 14:28:09
【问题描述】:

我写了一些代码:

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

    int a_function(int *a, int a_length, int *returned_address)
    {
        returned_address=a+a_length-1;
        return 0;
    }

    int main(void)
    {
        int n=5;
        int *a;
        int *address=NULL;
        a=(int*)malloc(n*sizeof(*a));
        a_function(a,n,address);
        printf("%p",address);
        return 0;
    }

预期的结果是指针'address'指向地址为a+4的内存块。但是结果是指针'address'仍然指向NULL(屏幕上的打印结果就像'00000000')。但是,当我开始调试时,在“a_function”内部,“returned_address”确实指向 a+4 处的内存块。我错过了什么?

【问题讨论】:

  • 标准警告:请do not castmalloc()和family的返回值。
  • @SouravGhosh 好的,谢谢。
  • 如果您想从函数内部更改调用函数中存储在指针变量中的值,您必须将指针传递给指向被调用函数的指针。因此,您需要int **returned_address 作为第三个参数,&amp;address 作为调用的第三个参数。
  • @JonathanLeffler 我现在得到你的答复,谢谢。

标签: c function pointers arguments memory-address


【解决方案1】:

在 c 中,参数是按值传递的。当您将指针传递给函数时,其地址将被复制到函数参数。调用者只能看到对指针指向的位置内容的修改。这意味着参数returned_address 可以指向其他位置。

所以,returned_address=a+a_length-1; 使returned_address 指向一个新位置,即,它的内容被新的赋值覆盖,而传递的指针address 指向NULL

您可以通过使用指向指针的指针来解决此问题。

void a_function(int *a, int a_length, int **returned_address)
{
    *returned_address=a+a_length-1;
}  

并将其称为

a_function(a, n, &address);

【讨论】:

  • 谢谢。我现在明白了这个概念。但是我想知道如果我仍然保留“int *returned_address”但将函数调用为 a_function(a,n,&address),它会工作吗?
  • 没有。不起作用。 &amp;addressint ** 类型,但您的函数需要 int * 类型。
【解决方案2】:

如果你想在函数内部改变存储在调用函数的指针变量中的值,你必须传递一个指向被调用函数指针的指针。因此,您需要int **returned_address 作为第三个参数,&amp;address 作为调用的第三个参数。

void a_function(int *a, int a_length, int **returned_address)
{
    *returned_address = a + a_length - 1;
}

还有电话:

a_function(a, n, &address);

请注意,您不使用函数返回的值,因此它也可以是void 类型。

【讨论】:

    【解决方案3】:

    应该是NULLaddress本身是传值的,不是吗?

    a_function() 内部,对returned_address 的任何更改都是a_function() 本地的。

    OTOH,对*returned_address 的任何更改都将反映在main() 中。

    【讨论】:

    • 哦,我明白了。谢谢你。那么有没有办法做我期望的事情?
    • @V.T.T.Pham。 1)不客气。 2) 是的,请阅读双指针(或指针对指针)。
    【解决方案4】:

    函数应该接收int *&amp;returned_adress

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2017-11-28
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多