今天刷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)使用位高权重的全局变量,其实和增加一个标志性参数是一样的,就是下面修改的内容能传递上去,但是这种方式实现起来比较简单,缺点就是使用了全局变量。