c语言语法(三)
2015-08-14 10:35
134 查看
今天刷c语言题的时候,在函数传递指针的问题上进行了一下思考,主要参考这篇文章/article/5495207.html
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
1、 试图用指针参数申请动态内存可以用两种方式
1)指针的指针申请动态内存
void allocate(char** point)
2)返回堆指针,这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡
char * allocate()
2、其实还有一种方式可以将指针作为输入输出参数,就是在函数体外申请内存,调用函数虽然是值拷贝,但是因为两个都指向该内存地址,所以修改函数体内的内容就是修改函数体外的内容
char* c = (char*)malloc(sizeof(char)*100) ;
void allocate(char* point) ;
在写二叉树的时候,如何在查到所要的内容,就强制停止递归呢?
主要参考这篇文章http://jingyan.baidu.com/article/c45ad29cf51378051753e200.html
其实有三种方法:
1)用“return bool值”退出循环,基本函数的返回值就是bool类型的
2)增加一个标志性参数,在传参的过程中加一个开关标志,当然应该保证的是指针传递,这样下面修改的内容才能传递给上面
3)使用位高权重的全局变量,其实和增加一个标志性参数是一样的,就是下面修改的内容能传递上去,但是这种方式实现起来比较简单,缺点就是使用了全局变量。
void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); // str 仍然为 NULL strcpy(str, "hello"); // 运行错误 }
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
1、 试图用指针参数申请动态内存可以用两种方式
1)指针的指针申请动态内存
void allocate(char** point)
2)返回堆指针,这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡
char * allocate()
2、其实还有一种方式可以将指针作为输入输出参数,就是在函数体外申请内存,调用函数虽然是值拷贝,但是因为两个都指向该内存地址,所以修改函数体内的内容就是修改函数体外的内容
char* c = (char*)malloc(sizeof(char)*100) ;
void allocate(char* point) ;
在写二叉树的时候,如何在查到所要的内容,就强制停止递归呢?
主要参考这篇文章http://jingyan.baidu.com/article/c45ad29cf51378051753e200.html
其实有三种方法:
1)用“return bool值”退出循环,基本函数的返回值就是bool类型的
2)增加一个标志性参数,在传参的过程中加一个开关标志,当然应该保证的是指针传递,这样下面修改的内容才能传递给上面
3)使用位高权重的全局变量,其实和增加一个标志性参数是一样的,就是下面修改的内容能传递上去,但是这种方式实现起来比较简单,缺点就是使用了全局变量。
相关文章推荐
- iOS概念入门学习-C语言-字符串
- C++序列操作之std::partition
- C语言的有符号与无符号,二进制整数的扩展与截断
- VC++ 浅谈VS2010中CMFCToolBar的用法
- VS2010 C++ 学习笔记(四) 1.数据的封装 2.类外定义 3.构造函数(无参,有参,重载,初始化列表,拷贝) 4.练习
- C++存储方案
- 【转】C语言mem.h中的函数介绍
- 【转】c语言位域操作—_结构体内冒号:的使用
- 50条大牛C++编程开发学习建议
- VC++获取病毒的消息钩子
- iOS概念入门学习-C语言-指针
- C++成员函数重载 覆盖 隐藏
- C++常见的质数判断算法
- c++ inline 的位置不当导致的 无法解析的外部符号
- C++判断两个序列的包含关系: std::includes
- VS2010,C语言编程调用函数sqrt
- C++模板学习
- 深入理解C++对象模型-对象的内存布局,vptr,vtable
- OC语言-05-OC语言-内存管理
- VC++中窄字节、宽字节的由来