2012-08-19 69 views
0

當我嘗試運行含有參數的程序時,出現分段錯誤錯誤。現在,我已經通過GDB運行它,並發現有問題的行,它看起來像這樣:c - 分段錯誤(核心轉儲)指針問題

*dstip = (*optarg); 

的原型爲:

char *dstip; 

,最後它被稱爲該行:

char *filter = ("ip dest host %s", dstip); 

現在回頭看看它,我並不感到驚訝它不工作,因爲它看起來......坦率地說錯了,並通過完全刪除這些行(並更改過濾器文本)來解決問題。但是,我需要輸入的IPv4地址顯示在錯誤消息過濾器中,並且用於指針,並且嘗試了不同的事情來回傳遞,我無法做到。也就是說,我只得到warning initialization makes pointer from integer之類的......做什麼?

+0

什麼是optarg? – Scooter 2012-08-19 16:57:55

+0

@Scooter:'optarg'是與['getopt()']一起使用的全局變量之一(http://pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html)。 – 2012-08-19 16:59:36

+1

如果你想保留'getopt()'發現的參數記錄,通常只需要寫下:'dstip = optarg;'將存儲在變量'optarg'中的指針賦給指針變量'dstip' 。 – 2012-08-19 17:01:00

回答

5

聲明

*dstip = (*optarg); 

不設置dstip指向optarg。相反,它將dstip指向的第一個字符設置爲與optarg指向的第一個字符相同的值。即這是一樣的

dstip[0] = optarg[0]; 

由於dstip是未初始化的指針,你在內存中更改的未分配區域,這將導致奇怪的事情發生。

而且,表達

("ip dest host %s", dstip) 

不會做你認爲這樣做,至少,如果你認爲它會返回一個格式化字符串。實際上它使用逗號運算符來評估逗號兩側的表達式,但只返回逗號右側表達式的結果。

+0

謝謝你這麼徹底的回答,但你建議我做什麼呢?編寫'dstip = optarg;'編譯,但正如你所說的,它只打印'dstip'的值。不僅如此,而且每隔一段時間它工作或給出GDB找不到的段錯誤。 – youjustreadthis 2012-08-19 17:24:11

+1

@youjustreadthis:確保初始化指針; 'char * dstip = 0;'或者'char * dstip =「127.0.0.1」;'。在使用它之前確保指針不爲空。要格式化過濾器字符串,請使用'snprintf()':'char filterbuff [64]; snprintf(filterbuff,sizeof(fileterbuff),「ip dest host host%s」,dstip); filter = filterbuf;'或類似的東西。你可以給我的'filterbuf'命名'filter'並放棄作業;這是否是一種安全的轉換取決於變量'filter'是如何在代碼中的其他地方聲明和使用的。 – 2012-08-19 19:10:20