2016-04-24 47 views
-1

我的程序有以下警告,因爲這些我認爲是顯示了一個核心轉儲分段錯誤:「的getaddrinfo」時將整數指針沒有施放[默認啓用]

warning: passing argument 2 of ‘getaddrinfo’ makes pointer from integer without a cast [enabled by default] 

rc = getaddrinfo(svrHost, svrPort, &hints, &res); 
         ^
In file included from client6_main.c:16:0: 
/usr/include/netdb.h:662:12: note: expected ‘const char * restrict’ but argument is of type ‘short unsigned int’ 
extern int getaddrinfo (const char *__restrict __name, 

代碼段是:

rc = getaddrinfo(svrHost, svrPort, &hints, &res); 

if(rc != 0){ 
    printf("Host not found --> %s\n", gai_strerror(rc)); 
    if (rc == EAI_SYSTEM) 
     perror("getaddrinfo() failed"); 
} 

請指導

+0

那麼,'svrPort'的類型是什麼? –

+0

'getaddrinfo'的第二個參數必須是'const char *'類型。閱讀精美的手冊。 –

回答

1

你需要把服務名稱或爲小數字符串作爲getaddrinfo調用的第二個參數的端口號。

對於這一點,只是改變了可變svrPortunsigned short類型char*char const*,並使其指向一個有效的字符串。例如,或"80"而不是80

+0

你可以很好地使用80,但是作爲一個字符串'「80」'。 –

+0

你是對的,的確,我忽略了這一點。編輯您的評論。 – rems4e

+0

另外「任一節點或服務,但不能同時爲NULL。」 –

1

前兩個函數參數應該是指向字符串的指針。

int getaddrinfo(const char *node, 
       const char *service, 
       const struct addrinfo *hints, 
       struct addrinfo **res); 

我從你得到了svrPortint類型的警報承擔。 編譯器會將其作爲指針處理。如果svrPort初始化爲1234,則該函數將查找從地址1234開始的字符串,該字符串可能是或可能不是有效地址。

您應該通過NULL0告訴getaddrinfo忽略此參數。

相關問題