您的位置:首页 > 编程语言 > C语言/C++

双指针的作用

2016-07-11 15:52 309 查看
用法1:

用作函数的返回值,比较常见的是返回分配的堆内存地址。

下面用一个例子进行说明下:

[cpp] view
plain copy

 print?

/*****************************************************************************/  

/** 

* \brief       分配指定大小size的堆空间 

* \param[out]  pst      分配的内存的地址 

* \param[in]   size     需要分配的内存大小 

* \return      返回值描述 

* \remarks     其它信息 

******************************************************************************/  

bool get_memory(char *pst, unsigned int size)  

{  

    if (0 == size)  

    {  

        pst = NULL;  

        return false;  

    }  

  

    pst = (char*)malloc(size);  

    if (NULL == pst)  

    {  

        return false;  

    }  

    memset(pst, 0, size);  

  

    return true;  

}  

  

int use_get_memory()  

{  

    char *pStr = NULL;  

    char buf[] = "hello world.";  

    get_memory(pStr, 1024);  

  

    memcpy(pStr, buf, sizeof(buf));  

  

    return 0;  

}  

当我们运行这段程序的时候,会发现程序崩溃了,出错的原因是对内存的非法访问,为什么会出现这种情况呢,我们明明已经分配了内存的啊,那我们就进行调试一下,看看问题究竟出现在哪里,vs的调试截图如下:



发现调用get_memory函数之后,pStr所指向的内存竟然是空的,可见问题就出现在这里。

函数参数的传递是按值传递的,指针类型的参数其实也是按值进行传递的,只不过传递的是变量的地址,按值传递会进行拷贝,下面用一个图进行解释。



调用get_memory后,pStr参数会进行拷贝传给get_memory,这里假设拷贝之后的参数为_pStr,执行malloc之后,_pStr指向的是分配的堆空间,而pStr指向的仍然是NULL,所以使用pStr进行操作的时候,会报内存非法访问的错误,而此时,get_memory返回后,新分配的内存(_pStr所指向的空间)没发使用,还会导致内存泄露。

正确的用法为

[cpp] view
plain copy

 print?

/*****************************************************************************/  

/** 

* \brief       分配指定大小size的堆空间 

* \param[out]  pst      分配的内存的地址 

* \param[in]   size     需要分配的内存大小 

* \return      返回值描述 

* \remarks     其它信息 

******************************************************************************/  

bool get_memory(char **pst, unsigned int size)  

{  

    if (0 == size)  

    {  

        pst = NULL;  

        return false;  

    }  

  

    (*pst) = (char*)malloc(size);  

    if (NULL == *pst)  

    {  

        return false;  

    }  

    memset(*pst, 0, size);  

  

    return true;  

}  

  

int use_get_memory()  

{  

    char *pStr = NULL;  

    char buf[] = "hello world.";  

  

    if (get_memory(&pStr, 1024) == false)  

    {  

        return -1;  

    }  

    memcpy(pStr, buf, sizeof(buf));  

  

    printf("%s\n", pStr);  

  

    free(pStr);  

    pStr = NULL;  

  

    return 0;  

}  



传入的是pStr的地址,进入函数后进行解引用操作,就是对pStr实际地址进行操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息