2013-04-05 82 views
1

我寫了一個簡單的程序,返回作爲參數傳遞的IP地址的主機名。該程序使用兩個函數:getaddrinfo()和getnameinfo()。 我正在使用Linux Mint,Netbeans IDE和G ++編譯器。輸出是正常的,沒有錯誤,但是當我宣佈一個Cout在聲明一個std :: string變量後不給出輸出

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; 
} 
+1

我想'hostname'需要分配內存。 – chris 2013-04-05 21:24:38

+5

C++不能這樣工作。它與弦無關。你不能瘋狂地聲明'char *'並希望它指向某個合理的地方。看看[這個例子](http://en.wikipedia.org/wiki/Getaddrinfo)的一些靈感。 – 2013-04-05 21:25:08

回答

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

你的指針必須實際分配。評論這條線改變任何事情的事實可能是優化的巧合或奇怪的副作用。

0

謝謝,它現在工作:)。我想知道何時使用不同的方式來分配內存。 據我知道以下面的方式創建一個對象之間的主要區別在於:

// Creating objects: 
Test t1; 
Test* t2 = new Test(); 
  1. 第一個目的將在堆被創建,它將在函數被完成運行被自動刪除。
  2. 第二個對象將在堆棧​​中創建並且內存釋放必須使用delete/delete []運算符手動完成?

那麼在處理指針時還應該記住什麼呢? 我想我需要閱讀一本關於計算機體系結構的好書,因爲關於內存和微處理器的知識會帶來利潤:)