二维指针与函数参数

2010 四月 16th by Hacksign

原文:http://www.b2cbeta.com/program-life/%E4%BA%8C%E7%BB%B4%E6%8C%87%E9%92%88%E4%B8%8E%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0
很久没有写c/c++代码了,不过以前积累的一些点还是慢慢积累下来。备用嘛

一般函数中,指针作为参数不会有太多的问题,通常传指针时会传入指针指向可用地址的最大长度。函数内操作时用到拷贝函数时,需要限定这个最大值(字符串指针通常会这么做)。不然会越界。指针作为函数参数传递时,编译器为指针参数制造了一个副本,在函数体内对这个指针副本指向的进行修改,对应的指针参数的内容也做了一个修改,这就是为什么可以用指针作为输出参数的原因。

举一个例子:

int test_point(char *a, int len)
 
{
 
    char b[10]  = “iamb”;
 
     memcpy(a, b, len);
 
}
 
int main()
 
{
 
    char *a = “iama”;
 
    test_point(a, 10);
 
}

在调用test_point函数时,编译器创建了指针_a,指向a所对应的内容“iama”,这个时候通过memcpy可以使_a指向的内容变成”iamb”。因为a和_a指向的内容一致,所以a的内容也变成了”iamb”。

如果我们想在函数内申请一块动态内存,外面可以访问,应该怎么做呢?

以下代码行不行呢?

 
int test_point(char *a, int len)
 
{
 
    a = (char *)malloc(sizeof(char) * len); //动态申请域名,想供外部使用。
 
    //do some stuff
 
}
 
void test()
 
{
 
    char *a = NULL;
 
    test_point(a, 20);//想申请20个字符大的内存。
 
     strcpy(a, “hello,world”);//??
 
}

运行到strcpy就会出现错误,从上面的分析可以看出,test_point内部的a只是副本_a,如果把动态分配的内存赋值给了_a,也是就是改变了_a的指向,原先指向于a相同的内容地址现在指向了动态分配的内存。这个时候,a和_a完全没有联系了。

所以strcpy(a, “hello,world”);这句话执行时,a还是指向NULL,导致出错!

那么如何来解决这个问题呢?推出我们的主角,二维指针。

int test_point(char **a, int len)
 
{
 
    *a = (char *)malloc(sizeof(char) * len); //动态申请域名,想供外部使用。
 
    //do some stuff
 
}
 
void test()
 
{
 
    char *a = NULL;
 
    test_point(&a, 20);//注意要使用&
 
     strcpy(a, “hello,world”);
 
}

这样就搞定问题了。这是为什么呢?

仔细想想其实很简单,看下面的顺序

a->*a->**a

_a->*a->malloc

a->*a->malloc

2 Responses to “二维指针与函数参数”

  1. Black Says:

    来看看你。哈啊和。对指针很迷茫~~

  2. Hacksign Says:

    呵呵,迷茫就对了…我到现在也很迷茫,哈哈~

Leave a Reply