void getmemory(char *p) { p=(char*)malloc(100); } void test(void) { char * str = null; getmemory(str); strcpy(str,”hello,world”); printf(str); }请问运行test函数会有什么样的结果?
void getmemory(char **p){ *p = (char *)malloc(100); } void test(void){ char *str = NULL; getmemory(&str); //对指针str取值,传递二级指针 strcpy(str, "hello,world"); printf(str); }
#include "iostream" using namespace std; int b=2; void printP(int *p) { p = &b; } void printP2(int *&p) { p = &b; } int main() { int a=1; int *p = &a; printP(p); cout<<p<<" "<<*p<<endl;//0x7fff5839e71c 1 printP2(p); cout<<p<<" "<<*p<<endl;//0x1078630c0 2 }
如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;
首先,这个想法是可以实现的;
其次,题目中的形参有误,导致p指针没有变化。
下面先贴上正确的函数实现方式,仔细看哪一点不同:
形参由char *p改成char *&p就正确了,代码中memset用来初始化新开辟空间为'\0',没有memset也能编译通过,并且得到正确结果。
题目的目的应该是考查指针的在函数中的传入和传出。本题中,在主函数中的str指针要通过getmemory函数,去指向一个新的char[100]的内存地址,我们知道,在函数中malloc出一个新空间,是在堆中生成的,即可以在函数外使用。知道本题的目的,就可以用另一种传入传出指针的方式来实现: