双指针的作用
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实际地址进行操作。
用作函数的返回值,比较常见的是返回分配的堆内存地址。
下面用一个例子进行说明下:
[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实际地址进行操作。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例