您的位置:首页 > 编程语言 > C语言/C++

c语言语法(三)

2015-08-14 10:35 134 查看
今天刷c语言题的时候,在函数传递指针的问题上进行了一下思考,主要参考这篇文章/article/5495207.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)使用位高权重的全局变量,其实和增加一个标志性参数是一样的,就是下面修改的内容能传递上去,但是这种方式实现起来比较简单,缺点就是使用了全局变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: