我开发了c ++程序,我希望存储clientadd,clientport,servaddr,servport 在stl地图中。 我能够传递值来映射和显示地图。 我显示的值正确显示(clientadd,clientport,servport) 但是servaddr错了。
map<int, Values> items;
Values connection (inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port));
items.insert(pair<int, Values> (0, connection));
cout << "Size of the items map : " << items.size() << endl;
map<int,Values>::const_iterator itemsIterator = items.begin();
while(itemsIterator != items.end() )
{
Values item = itemsIterator->second;
item.printValues();
itemsIterator++; //make the iterator point to the next pair in the map
}
class Values
{
private:
char *C_addr;
int C_port;
char *S_addr;
int S_port;
public:
Values(char*,int,char*,int);
void printValues();
};
Values :: Values(char *faddr,int fport,char *gwaddr,int gport)
{
C_addr=faddr;
C_port=fport;
S_addr=gwaddr;
S_port=gport;
}
void Values::printValues()
{
cout << C_addr<<":" <<C_port<< ":" << S_addr <<":" <<S_port << endl;
}
输出我期待
127.0.0.1:任何端口号:0.0.0.0:任何端口号
(即客户端地址,客户端端口,服务地址,服务端口)
但我得到这样的输出
127.0.0.1:任何端口号:127.0.0.1:任何端口号
答案 0 :(得分:2)
来自inet_ntoa
的{{3}}:
该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区。
因此两个构造函数参数都指向同一个缓冲区,填充了最后写入的地址。如果其他一些代码再次调用inet_ntoa
,那么它们甚至会成为wronger。
使用std::string
而不是指针来保留字符串的副本。