我写了一个简单的程序,返回作为参数传递的IP地址的主机名。 该程序使用两个函数:getaddrinfo()和getnameinfo()。 我正在使用Linux Mint,Netbeans IDE和G ++编译器。输出没问题,没有错误,但是当我声明
时std::string str;
然后cout没有输出,屏幕上没有任何内容。但是当我注释掉std :: string声明或删除它时,语句
std::cout << "hostname: " << hostname << std::endl;
成功打印返回的主机名。
造成这种奇怪错误的原因是什么?
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <iostream>
#include <string>
int main()
{
struct addrinfo* result;
struct addrinfo* res;
int error;
const char* host;
// When I comment out this line, cout prints the hostnames succesfully.
std::string str;
error = getaddrinfo("127.0.0.1", NULL, NULL, &result);
res = result;
while (res != NULL)
{
char* hostname;
error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, 1025, NULL, 0, 0);
std::cout << "hostname: " << hostname << std::endl;
res = res->ai_next;
}
freeaddrinfo(result);
// When I declare an std::string str variable, this cout doesn't either print anything
std::cout << "TEST" << std::endl;
return 0;
}
答案 0 :(得分:3)
The arguments host and serv are pointers to caller-
allocated buffers (of size hostlen and servlen respectively) into which
getnameinfo() places null-terminated strings containing the host and
service names respectively.
http://man7.org/linux/man-pages/man3/getnameinfo.3.html
您的指针必须实际分配。评论该行改变任何事情的事实可能是优化的巧合或奇怪的副作用。
答案 1 :(得分:0)
谢谢,它现在有效:)。我想知道何时使用不同的方式来分配内存。 据我所知,以下列方式创建对象之间的主要区别是:
// Creating objects:
Test t1;
Test* t2 = new Test();
那么在处理指针时我还应该记住什么呢? 我想我需要阅读一本关于计算机体系结构的好书,因为有关内存和微处理器的知识会带来利润:)