心の中で遭遇する1つの問題

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で、ポイントリストの先頭に
なるようにしますステップは、通常の後に行われてもよいです


はい、非常に簡単な質問が、私はそれは少し知識ができない、ああ、細部に注意を払うに学ぶことを示す、思いつきました

リリース7件のオリジナルの記事 ウォンの賞賛1 ビュー706

おすすめ

転載: blog.csdn.net/qq_41957544/article/details/89782657