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

V.T*_*am. 0 c pointers arguments function 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;
    }
Run Code Online (Sandbox Code Playgroud)

预期的结果是指针'地址'指向a + 4地址处的内存块.但结果是指针"地址"仍指向NULL(屏幕上的打印结果类似于'00000000').但是,当我开始调试时,在'a_function'中,'returned_address'确实指向了+ 4的内存块.我错过了什么?

hac*_*cks 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;
}  
Run Code Online (Sandbox Code Playgroud)

并称之为

a_function(a, n, &address);
Run Code Online (Sandbox Code Playgroud)