最近在写一段函数的时候发现了一个关于指针出参的问题,当时情况是这样的,我打算将形参声明为char型指针,在被调用函数中为该指针分配空间。由于设计的需要,并不会将地址作为返回值,而是需要通过出参来达到取得地址的效果。
示例代码如下:
int getPoint(char *src)
{
src=(char *)malloc(100);
if(NULL == src)
return -1;
return 0;
}
int main(void)
{
char *point = NULL;
getPoint(point);
if(NULL == point)
printf("the point is NULL\n");
if(NULL != point)
printf("the point is not NULL\n");
}
编译上述代码,执行二进制文件,执行结果为输出 the point is NULL。
这是因为在函数被调用的过程中,一般来讲我们分为传值和传址两种参数传递行为。在一般的传址行为中,我们需要对指定的地址上的数据进行修改,本质上传址行为也是传值行为,这不过传递的是地址的拷贝,按照地址的拷贝去修改制定内存上的值,这样在使用该源地址去取值的时候,会得到修改后的值。传值行为就不介绍了。
在需要指针出参的函数调用中,虽然我们传递的是地址,但是需要注意,我们将要修改的值恰恰正是这个地址,因为在被调用函数中为指针参数分配空间会修改其指向的内存,即修改该指针的值。这与普通意义上的传值行为是一样的,传递进去的只是该指针值的一个拷贝,单单修改这个拷贝,除非将返回值修改为该指针,否则是不能修改原指针上保存的值,所以此处我们需要传递给被调用函数的是该指针的地址,即更深一层的传址操作(指针的地址,修改指针上的值,而不是修改指针指向的内存上值)。
指针出参需要将指针的地址传递进去,这样才能达到修改该指针保存的值的效果。其实想通了就明白了,这也是因为传值与传址的差别了。
示例代码如下:
int getPoint(char *src)
{
src=(char *)malloc(100);
if(NULL == src)
return -1;
return 0;
}
int main(void)
{
char *point = NULL;
getPoint(point);
if(NULL == point)
printf("the point is NULL\n");
if(NULL != point)
printf("the point is not NULL\n");
}
编译上述代码,执行二进制文件,执行结果为输出 the point is NULL。
这是因为在函数被调用的过程中,一般来讲我们分为传值和传址两种参数传递行为。在一般的传址行为中,我们需要对指定的地址上的数据进行修改,本质上传址行为也是传值行为,这不过传递的是地址的拷贝,按照地址的拷贝去修改制定内存上的值,这样在使用该源地址去取值的时候,会得到修改后的值。传值行为就不介绍了。
在需要指针出参的函数调用中,虽然我们传递的是地址,但是需要注意,我们将要修改的值恰恰正是这个地址,因为在被调用函数中为指针参数分配空间会修改其指向的内存,即修改该指针的值。这与普通意义上的传值行为是一样的,传递进去的只是该指针值的一个拷贝,单单修改这个拷贝,除非将返回值修改为该指针,否则是不能修改原指针上保存的值,所以此处我们需要传递给被调用函数的是该指针的地址,即更深一层的传址操作(指针的地址,修改指针上的值,而不是修改指针指向的内存上值)。
指针出参需要将指针的地址传递进去,这样才能达到修改该指针保存的值的效果。其实想通了就明白了,这也是因为传值与传址的差别了。