作者:ouyan1985_998 | 来源:互联网 | 2023-05-17 10:32
void B(char*);
void D(char*);
void A()
{
char * p = new char[20];//(char*)malloc(20);
B(p);
cout <<"in A, address=" <<(long) p << endl;
cout <<"in A, cOntent=" << p << endl;
delete(p);
}
void B(char * p)
{
memcpy(p,"aaa",3);
cout << "in B, address=" << (long)p << endl;
cout << "in B, cOntent=" << p << endl;
}
void C()
{
char * p = 0;
D(p);
cout <<"in C after call D, address=" <<(long) p << endl;
cout <<"in C after call D, cOntent=" << p << endl;
free(p);
}
void D(char* p)
{
p = (char*) malloc(20);
memcpy(p,"aaa",3);
cout << "in D, address=" << (long)p << endl;
cout << "in D, cOntent=" << p << endl;
}
int main()
{
A();
cout << "-----" << endl;
C();
}
为什么A调B可以获取指针参数所指内容,而C调D无法获取内容?
10 个解决方案
因为D接受的是一个“指针值参”(C不支持变参类型),所以你在D中对p的赋值不会影响C的的变量。
改为:
void D(char** p)
{
*p = (char*) malloc(20);
memcpy(*p,"aaa",3);
cout << "in D, address=" << (long)*p << endl;
cout << "in D, cOntent=" << *p << endl;
}
void C()
{
char * p = 0;
D(&p);
cout <<"in C after call D, address=" <<(long) p << endl;
cout <<"in C after call D, cOntent=" << p << endl;
free(p);
}
也就是用指针实现“变参”的方法。
因为c是传值而不是传地址的
void D(char* p)
{
p = (char*) malloc(20); //被重新赋值但无法返回。
memcpy(p,"aaa",3);
cout << "in D, address=" << (long)p << endl;
cout << "in D, cOntent=" << p << endl;
}
改为:
char * D()
{
p=...
return p;
}
void C()
{
char * p = 0;
p= D();
...
}
因为c是传值而不是传地址的
void D(char* p)
{
p = (char*) malloc(20); //被重新赋值但无法返回。
memcpy(p,"aaa",3);
cout << "in D, address=" << (long)p << endl;
cout << "in D, cOntent=" << p << endl;
}
改为:
char * D()
{
p=...
return p;
}
void C()
{
char * p = 0;
p= D();
...
}
或者如snipersu所说使用引用类型(只能在C++中使用)
用char*传递参数,实际上是传递了指针的副本。如果修改指针所指的内容,则函数调用结束后内容自然保存了变化。如果是修改了指针,则实际上是修改了指针副本本身,此时再修改其所指值,则显然不是修改的原来地址处的内容,所以函数结束后也没有看到内容变化。D中使用malloc改变了指针副本所指向的单元。
如果要想在被调函数中分配空间,赋值后希望调用方能获取内容,应该使用char**类型做参数。
因为在函数中传指针(如:p)的话,实际上是函数建立一个指针指向p所指的地方,由于才C中p是个空指针,所以虽然在D中让D的p指向了分配的空间但在C中的p还是指向空的。
另外 memcpy(p,"aaa\0",4);这样吧要不就不知道后边跟什么东东了。
因为在函数中传指针(如:p)的话,实际上是函数建立一个指针指向p所指的地方,由于才C中p是个空指针,所以虽然在D中让D的p指向了分配的空间但在C中的p还是指向空的。
另外 memcpy(p,"aaa\0",4);这样吧要不就不知道后边跟什么东东了。
偶的网络太差了,连的两个贴写完后竟然有n个老兄回贴了。痛苦ing。
T!T
c/c++板块就是人气旺。呵呵,sipersu不用痛苦,大家都有分。