我写了一些代码:
#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的内存块。我错过了什么?
答案 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)
应该是NULL
。 address
本身是按值传递的,不是吗?
在a_function()
内,对returned_address
的任何更改都是a_function()
的本地更改。
OTOH,对*returned_address
的任何更改都会反映在main()
。
答案 3 :(得分:-2)
该功能应该收到int *&returned_adress
。