至少我有点困惑。 ()函数getaddrinfo()调用'更新'指向addrinfo结构的指针,当我要在相同作用域(该函数)中使用addrinfo时,一切正常,但如果将结构复制到另一个结构(通过指定它) 。getaddrinfo addrinfo导致堆栈或堆栈
请帮助我理解正在进行的基础知识(而不是寻求替代方法的建议)。
如果我错了,请纠正我: a)getaddrinfo()需要一个指向指向addrinfo的struct指针的指针。 b)getaddrinfo在当前函数作用域中创建一个addrinfo结构,并更新a)所需的指针。
现在我真正的问题:我想将addrinfo存储在别的地方。使用分配给其他指针不会进行深度复制,并且在函数之后所有指针都变为无效?
最好给一个非常简单的例子:
void GetAddrInfo(struct addrinfo *update)
{
struct addrinfo *res;
getaddrinfo(xx,xx,xx,&res);
//is this save? After this 'scope' ends all pointed fields are invalid?
//this doesn't copy the linked list ai_next.
*update=*res;
}
直接使用上的getaddrinfo &更新似乎不起作用,因为问题依然存在:功能范围结束后,原来的结构被摧毁。
任何人都可以在这里给我更多的了解(请解释一下什么被创建这里和销毁,其中,栈,堆所有的信息是值得欢迎的)
感谢您的反馈。纠正我,如果我错了:通常当我创建一个结构实例时,它会在堆栈右侧创建,并在当前范围完成后“清除”?所以getaddrinfo在这里是一个特例?有没有一种方法可以找到保存数据的功能? – 2011-03-24 19:58:09
@Ger所有本地变量都在堆栈上,正确。但是你并没有创建'addrinfo'结构; 'getaddrinfo()'用'malloc()'为你创建结构,这就是它在堆中的原因。你正在创建的是**结构体的**指针**。当函数结束时,你的**指针**消失,但结构本身仍然在堆中。 – chrisaycock 2011-03-24 20:02:14
这些可能是基本的问题;但所有其他的c函数更新结构指针工作在相同的方式? – 2011-03-24 20:04:49