2017-01-19 39 views
0

僅執行以下操作會導致分段錯誤。 它可能是argv或argc的東西? 真的失去了。提前致謝!客戶端程序中的分段錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <string.h> 
#include <unistd.h> 

#define MESSAGE "Not so important message" 

int main(int argc, char * argv[]) 
{ 
    printf(argc); 
    return 0; 
} 
+0

請參閱下面的答案(儘管可能有其他錯誤)。但是你可以通過一個調試器來發現這種問題,它會向你顯示段錯誤的發生。同樣格式化你的代碼,'if(hp!= NULL)'中條件代碼的格式非常差。 –

+0

感謝邁克爾,謝謝,我知道,如果(hp!= NULL)不是我應該使用的條件,但它只是當我最初擁有它(hp == NULL)時,seg故障仍然發生困惑我是因爲我認爲segfault是由於試圖解引用一個NULL hp而引起的,所以我只想看看是否(hp!= NULL)爲真,並且「Here 6」將被打印,但是無論我使用的是否打印語句執行如果(hp == NULL)或if(hp!= NULL),那麼segfault可能來自其他地方? – David

回答

2
if(hp != NULL) 
    { 
    printf("Here 6"); 
    perror("Failed to get host by name!"); 
    exit(1); 
    } 

你爲什麼要辭職,如果hp!=NULL?它應該是其他方式。你是去引用這種不正確的檢查後,空指針:

bcopy((char *)hp->h_addr, (char *) &server.sin_addr.s_addr, hp->h_length) 

更改爲:

if(hp == NULL) 
    { 
     perror("Failed to get host by name!"); 
     exit(1); 
    } 
+0

謝謝,如果(hp!= NULL)我實際上並沒有退出......只是當我最初擁有它(hp == NULL)時,seg錯誤仍然發生,這使我困惑,因爲我認爲segfault是由於試圖解引用NULL hp而引起的,所以我只想看看if(hp!= NULL)是否爲true,並且「Here 6」會打印出來,但無論我使用if(hp == NULL )或者如果(hp!= NULL),那麼segfault可能來自其他地方? – David

+0

如果您覺得有用,請考慮接受答案。 – Prabhu

0

,如果我不提供主機名作爲參數,我只能得到一個段錯誤。當你試圖用argv [1]的參數調用gethostbyname時,這是有道理的,如果沒有提供參數,它將是一個NULL指針。

您看不到任何printf()消息的原因是輸出被緩衝,如果您將其更改爲打印到stderr(默認無緩衝),您會在segfault之前看到它們。

+0

在printf格式字符串的末尾有'\ n'也有幫助。 –

+0

感謝c3st7n,我將條件改回爲if(hp == NULL)並將所有printf語句更改爲stderr,但我仍然有相同的結果。你是說如果沒有參數提供,argv [1]將是一個NULL指針?我如何確保提供參數? – David

+0

您可以檢查argc的值,它會保存提供的參數數量(包括程序名稱本身)。所以在你的例子中,如果你檢查argc是否不等於2,你可以提前退出。 另外,如果你想,你可以在訪問它之前檢查argv [1]是否等於NULL,並適當地處理一個NULL值。 – c3st7n