今天在知乎看好一份非常好的指针的陷阱,做个搬运工:
题目要求就是给以下函数纠错:
void GetMemory( char*p )
{
p = (char*) malloc( 100 );
}
void Test( void )
{
char*str = NULL;
GetMemory(str);
strcpy(str,"hello world" );
printf(str);
}
答案是这样的: 传入中GetMemory(char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完后的str仍然为NULL;
。我觉得有关指针的问题,其实最好的理解方式莫过于绘图。
从Test函数执行开始,str指向的是NULL
然后经过GetMemory函数以后,在这里发生了一次赋值,即 char *p = str;
所以,p指向了(str指向的NULL),于是就变为了如此
然而经过了GetMemory的malloc以后,p获得了一块新内存的地址,于是p的指向就变为了这样
那么,从这里可以看出来str与p就分道扬镳了,而str也还是指向NULL。
那么,如何修改呢?一个是C++的引用,另外一个就是二重指针,即把GetMemory变为 GetMemory(char ** p) 来保存str的地址。
作者:蓝色
链接:https://www.zhihu.com/question/41476387/answer/91566794
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
https://www.zhihu.com/question/41476387