作为函数参数的指针接收内存地址(C)

时间:2015-03-09 14:28:10

标签: c function pointers arguments memory-address

我写了一些代码:

#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地址处的内存块。但结果是指针“地址”仍指向NULL(屏幕上的打印结果类似于'00000000')。但是,当我开始调试时,在'a_function'中,'returned_address'确实指向了+ 4的内存块。我错过了什么?

4 个答案:

答案 0 :(得分:6)

在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);

答案 1 :(得分:3)

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

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

电话:

a_function(a, n, &address);

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:-2)

该功能应该收到int *&returned_adress