您的位置:首页 > 其它

(转)指针的指针作用(申请空间)之一

2015-03-29 21:57 337 查看


指针的指针作用(申请空间)之一

转载地址:/article/7988131.html

以下是经典程序(载自林锐的从c/c++高质量编程),讲解的部分是我个人理解

void GetMemory(char *p,int num)

{

p=(char*)malloc(sizeof(char)*num); //p是形参指向的地址

}

void main()

{

char *str=NULL;

GetMemory(str,100); //str是实参指向的地址,不能通过调用函数来申请内存

strcpy(str,"hello");

}

结构是编译能通过,却不能运行,为什么呢?

先说一下指针作为函数参数的意义:当将指针作为参数时,实参向形参传递的是地址,在函数执行过程中,既可以对该参数指针进行处理,也可以对该参数指针所指向的数据进行处理,(以上程序段来说就是可以对p或*p进行处理)。由于此时形参和实参都是指向同一个存储单元,因此当形参指针所指向的数据改变时,实参指针所指向的数据也作相应的改变,因此这时的形参可以作为输出参数使用。

按照上面的说法,这个程序应该没有问题的啊,实参str和形参p指向同一个存储单元,给形参分配的内存单元应该也给实参分配了才对啊,问题就是在这里

实参和形参是指向同一个地址,它们只是指向相同,但它们自身的地址不是同时申请的,就是说p在申请内存时,str并不可以通过调用Getmemory同时申请内存,所以尽管str调用了GetMemory,但它仍然是个空指针,所以进行strcpy是就不能运行。

要使程序可以运行,只要小小的改动就行了(用指向指针的指针):

void GetMemory(char **p,int num)

{

*p=(char*)malloc(sizeof(char)*num); //此时*p就变成了是形参本身的地址

}

void main()

{

char *str=NULL;

GetMemory(&str,100); //&str是实参的地址,所以实参和形参之间就可以直接调用

strcpy(str,"hello");

free(str);

程序就会如你所愿,输出hello了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: