c/c++使用指针做函数返回值和指针作函数参数问题
来源:互联网 发布:linux 匹配文件名 编辑:程序博客网 时间:2024/05/19 10:42
1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);
char* GetMemory()
{
char p[] = "hi";
return p;
}
void main()
{
char *str = GetMemory(); //出错! 得到一块已释放的内存
printf(str);
}
例如:
char* GetMemory()
{
char *p = new char[100];
return p;
}
void main()
{
char *str = GetMemory();
delete [] str; //防止内存泄露!
}
1、有的情况下我们可能需要需要在调用函数中分配内存,而在主函数中使用,而针对的指针此时为函数的参数。此时应注意形参与实参的问题,因为在C语言中,形参只是继承了实参的值,是另外一个量(ps:返回值也是同理,传递了一个地址值(指针)或实数值),形参的改变并不能引起实参的改变。
2、直接使用形参分配内存的方式显然是错误的,因为实参的值并不会改变,如下则实参一直为NULL:
void GetMemory(char* p)
{
char *p = new char[100];
}
void main()
{
char *str;
GetMemory(str);
strcpy(str, "hi"); // str = NULL
}
3、由于通过指针是可以传值的,因为此时该指针的地址是在主函数中申请的栈内存,我们通过指针对该栈内存进行操作,从而改变了实参的值。
void Change(char *p)
{
*p = 'b';
}
void main()
{
char a = 'a';
char* p = &a;
Change(p);
printf("%c\n", a); //值a改变!
}
我们通过调用函数GetMemory,从而将pstr的内容赋给了p,此时p = ox46。通过对*p(ox23)的操作,即将内存地址为ox23之中的值改为char[100]的首地址,从而完成了对char* str地址的分配。
void GetMemory(char** p)
{
char *p = new char[100];
}
void main()
{
char a = 'a';
char* str = &a;
char** pstr = &str;
GetMemory(pstr);
strcpy(str, "hi");
}
5、注意指针的释放问题,可能形成悬浮指针。
当我们释放掉一个指针p后,只是告诉操作系统该段内存可以被其他程序使用,而该指针p的地址值(如ox23)仍然存在。如果再次给这块地址赋值是危险的,应该将p指针置为NULL。
调用函数删除主函数中的内存块时,虽然可以通过地址传递直接删除,但由于无法对该指针赋值(形参不能传值),可能造成悬浮指针,所以此时也应该采用指向指针的指针的形参。例如:
void MemoryFree(char** p)
{
delete *p;
*p = NULL;
}
void main()
{
char *str = new char[100];
char *pstr = &str;
MemoryFree(pstr);
}
- 顶
- 踩
- c/c++使用指针做函数返回值和指针作函数参数问题
- c/c++使用指针做函数返回值和指针作函数参数问题
- 使用指针做函数返回值和指针作函数参数问题
- 使用指针做函数返回值和指针作函数参数问题
- c指针做函数参数
- C++:指针作函数参数的情况
- c函数返回指针
- C函数返回指针
- c函数返回指针
- c函数返回指针
- c语言 指向函数的指针作函数参数
- C语言:指针做函数参数
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- C语言之指针专题四:指针做函数参数
- C语言之指针专题四:指针做函数参数
- C语言用结构体指针作函数参数
- C中的数组作函数参数被译为指针
- C语言用结构体指针作函数参数
- 1.大数据入门
- 在Ubuntu 16.04上为树莓派(RaspBerry Pi 3)编译Android 7(Nougat)
- leetcode--Merge Two Sorted Lists
- (Java)接口与抽象类
- HTTP深入浅出http请求
- c/c++使用指针做函数返回值和指针作函数参数问题
- HDU 1576 A/B 扩展欧几里德算法
- 小团队中人人都要会用点Docker
- java基础第四天 循环
- Linux学习笔记——20170807
- HDR Sensor 原理介绍
- leetcode--Generate Parentheses
- osg纹理材质设置
- hdu-3460-Ancient Printer(贪心+字典树)