Linux環境の使用で使用libpcapの開発、GDBでデバッグするには、次のセクションで問題を発見したメイクでミスがありました
int
main(int argc,char * argv[]){
.....
pcap_if_t ** alldevsp;
pcap_findalldevs(alldevsp,err_buf);
.....
}
结果:出现 segment fault
そして、問題を探し始め、自身がC言語の理解見つかっが印象的で十分ではありません
最初の
pcap_if_t ** alldevsp;
この文は、二つalldevspポインタ変数pcap_if_tへのポインタ*タイプ、この変数は変数pcap_if_tに格納されているalldevspアドレスのアドレス空間内のデータ、すなわち、4つのバイトを定義します*
そして、関数呼び出しを観察します
pcap_findalldevs(alldevsp,err_buf);
この文書プロトタイプはの数の関数であります
int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
Pcap_if_tは**データalldevspのタイプにパラメータを渡す必要
はなく、ビューの彼らの経験値、このパラメータの機能が行われた明白なこと
公式ドキュメントには、この機能は、すべてのネットワークカードのリストは、パラメータalldevspの構造を説明返すと言う
プロセスについての憶測は、このようなものです
pcap_if_t * temp = NULL;
temp = getListOfDevs(/);//通过此方法取得链表并返回链表第一个元素的指针
//temp现在指向这个链表的头
*alldevsp = temp;
練習前の場合
pcap_if_t ** alldevsp;
pcap_findalldevs(alldevsp,err_buf);
(GCCコンパイラがない変数は、生命の初期値として、初期値0が割り当てられないであろう)
、参照することは困難ではない
現在のパラメータの値がNULL alldevspある
(NULLとして初期化)するためのアドレスポインタ点alldevspすなわち、二つの可変
その後、このアドレスの関数はNULL *(アドレス割り当て)操作だった、確かに間違ってああです
あなたは、単にそう書くことはできません
正しい言葉遣いであります
pcap_if_t * alldevsp;
pcap_findalldevs(&alldevsp,err_buf);
これは、変数は関数アドレスalldevspに渡され、その後、関数の後に*操作は、このアドレスへの代入され、割り当てられた値がリストのアドレスであることを意味の頭部た
ことがメソッドを呼び出した後alldevspで、ポイントリストの先頭に
なるようにしますステップは、通常の後に行われてもよいです
。。。。
はい、非常に簡単な質問が、私はそれは少し知識ができない、ああ、細部に注意を払うに学ぶことを示す、思いつきました