c语言语法(三)
来源:互联网 发布:重庆seo网络优化 编辑:程序博客网 时间:2024/05/22 07:47
今天刷c语言题的时候,在函数传递指针的问题上进行了一下思考,主要参考这篇文章http://www.cnblogs.com/nearu/archive/2009/06/08/1498918.html
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)使用位高权重的全局变量,其实和增加一个标志性参数是一样的,就是下面修改的内容能传递上去,但是这种方式实现起来比较简单,缺点就是使用了全局变量。
- c语言语法(三)
- C、C++、Java三种语言语法对比(一)
- C 语言之三 声明的语法
- JNI之C语言(三)-- 基本语法
- C语言学习总结(三)——C语言的基本语法
- C语言(三)
- 黑马程序员—(iOS开发)C语言语法解析---(三)
- c语言基础语法三——数组
- C的三字母(Trigraph)语法。
- 【objectivet-c】语法(三)@property
- Objective-C 语法三(属性值)
- 【C语言疯狂讲义】(二)C语言语法基础
- c语言笔记(一)基本语法
- c语言基础(一)语法篇
- C语言基本语法
- C语言语法
- C语言声明语法
- C语言语法
- Ubuntu学习4_Ubuntu默认防火墙安装、启用、配置、端口、查看状态相关信息
- Wlan_station例程测试
- HDU 4099 Revenge of Fibonacci(大数加法+字典树)
- SILICON环境光和紫外线传感器SI1132调试笔记
- POJ----- 3299 Humidex
- c语言语法(三)
- 线段树 + 扫描线加深详解
- iOS概念入门学习-C语言-字符串
- java 如何跳出当前的多重嵌套循环
- 九度oj 1027
- Android开源项目分类汇总
- 如何在GNOME的鼠标右键菜单里添加启动终端的选项
- linux,windows 可执行文件(ELF、PE)
- Android自定义类似ProgressDialog效果的Dialog