2013-12-20 204 views
1

下面的代碼是打印protoent結構。打印初始化結構

除非我做getprotoent()我無法打印結構變量雖然我對其進行初始化。

如果我不getprotoent().

有誰知道這它結束細分動搖?

Samle.c

#include <stdio.h> 
#include <string.h> 
#include <netdb.h> 
int 
main(){ 
     struct protoent *proto; 
     memset(&proto,0,sizeof(proto)); 
     proto = getprotoent(); 

     printf("proto.p_name = %s\n",(*proto).p_name); 
     printf("proto.p_aliases = %s\n",*(*proto).p_aliases); 
     printf("proto.p_proto = %d\n",(*proto).p_proto); 
} 
+1

因爲沒有getprotoent,你沒有分配任何內存給結構指針。 – Ishmeet

+1

'memset'只是'proto = NULL',所以這是浪費時間。 – Devolus

+1

'* proto'只是一個指針,你永遠不會「初始化」它,當然你會得到段錯誤試圖解引用它。你需要malloc內存,最有可能在getprotoent()中完成。 – moeCake

回答

3

你應該使用:

struct protoent proto;
memset(&proto,0,sizeof(proto));

由於*proto是一個指向結構,它可以牽住struct protoent類型的變量的地址。您的聲明實際上並未初始化結構。

更多的解釋:

struct protoent *proto;
memset(&proto,0,sizeof(proto));

在某些系統中,這可能是相同struct protoent *proto = NULL;

因爲實際上

指針分配0」之後,您將在printf的狀態下解除引用nt,那肯定會導致seg故障。

編輯/ UPDATE:由user694733在評論

並非所有的系統分配地址0 NULL指針建議。它是保留爲NULL的某個地址的翻譯,當您執行<datatype> *ptr = 0;時,由編譯器完成。然而這樣做memset(&ptr,0,sizeof(ptr));不會被編譯器可以理解爲NULL assignment在這些系統上,它會簡單地分配地址0ptr這就像我說的可能不是一個NULL

欲瞭解更多信息,請參閱this link或完整C-FAQ chapterNULL指針。

我也想對SO舉this related answer

+1

memset在所有系統上都不*等於'proto = NULL;'。 – user694733

+0

@ user694733:請用一些例子來解釋一下嗎?因爲我相信如果'NULL'被定義爲'#',那麼這總是成立的。 –

+0

確實如此,但如果系統需要,編譯器會將其轉換爲實際值。另一方面,memset會在運行時發生。參見[C常見問題5.5](http://c-faq.com/null/machnon0.html)。 faq的第5章詳細解釋了NULL指針。 – user694733

2

memset的調用是一樣的,如果你會做

proto = 0; // Which is not neccessarily the same as NULL. 

它不分配內存,它只是初始化指針。

如果你想derference指針,你必須給它分配一些有效的記憶,這顯然是getprotoent()分配。解引用NULL指針會導致程序中止這是正確的。

+0

實際上'memset'ting這裏是UB吧? –

+1

@Koushik,它不是未定義的,因爲它不取消引用指針。儘管它很混亂,但沒用。 – Devolus

+0

memset在所有系統上都不*等於'proto = NULL;'。 – user694733

1

你正在做

//this defines pointer variable 
struct protoent *proto; 

//this does not allocate memory for the pointer variable 
memset(&proto,0,sizeof(proto)); 

所以每當你取消對它的引用不分配,或致電getprotoent,它就會失敗。