- viod GetMemory(char*p,int num)
- {
- p=(char*)malloc(sizeof(char)*num);
- }
- voidTest(void)
- {
- char*str=NULL;
- GetMemory(str,100);//str仍为NULL
- strcpy(str,"hello");//运行出错
- }
无论函数参数是什么类型,都是按照传递一份拷贝进去的,就算是指针也是一样。本例中,GetMemory(str,100)这句话,实际上传递的也是str指针的值null进去。所以其实GetMemory(char *p, int num)中的p指针实际上是一个临时变量(一个在别的内存位置的变量),只是存储了和str一样的值而已。所以在函数中改变的指针p的值只是改变了函数参数中临时变量的值,与str实际上是一点关系都没有,str还是null。
那么传指针究竟是什么作用呢?虽然指针的值也是一份拷贝进去的,但是由于拷贝的值的特殊性,因为指针的值实际上就是一个地址,那么在调用函数的内部,可以通过传递进来的临时指针变量的值引用指针所指向的内存空间,从而改变所指向空间的值。
所以,传递指针参数,不能改变指针所指向的地址,只能改变指针所指向地址的空间的值。
要使用指针的指针才行,也就是二级指针:
- viod GetMemory(char**p,int num)
- {
- *p=(char*)malloc(sizeof(char)*num);
- }
- voidTest(void)
- {
- char*str=NULL;
- GetMemory(&str,100);
- strcpy(str,"hello");
- }
我们可以用函数返回值来传递动态内存。这种方法更加简单
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}