我的應用程序運行在系統中的罰款,但在系統B段錯誤指針顯示爲(空)
系統A(Hyper-V的虛擬機)
- Linux的System_A 2.6.32-5-686 #1 SMP星期二5月13日16點33分32秒UTC 2014的i686的GNU/Linux
- gcc版本4.4.5(Debian的4.4.5-8)
- 文件系統:EXT3
體系B(覆盆子裨)
- Linux的System_B 3.12.28+#712 PREEMPT星期二09月16日15時49分十三秒BST 2014 armv6l的GNU/Linux
- gcc版本4.6.3(Debian的4.6.3-14 + rpi1)
- 文件系統:嘗試使用ext3和ext4
該應用程序的目的是跟蹤使用inotify
目錄中所做的更改。它將元數據保存到一個(如果它不存在,將被創建)日誌文件。但是,在系統B上它甚至沒有那麼遠。
當我運行程序來監視對目錄的更改時,它會在嘗試計算出正在修改哪個文件時崩潰。
我已經做了一些挖掘,似乎沒有正確設置一個文件名指針(我用作臨時文件名持有者,而我計算出該文件是否感興趣)。
變量使用
char *filename;
初始設置,我不使用變量以任何其他方式,直到我正在修改一個文件名填充它。
當我隨後事件的文件名(正在修改該文件)複製到一個臨時變量它出現segfaults:
strcpy(filename,event->name);
現在,當我加入一些
printf("ignoring %s \n", event->name);
printf("filename = %s \n", filename);
..before的strcpy所以我可以看到發生了什麼我看到:
對系統A
ignoring .testfile.swp
filename = Hd¤¿Xè|·ðc¤¿ÿÿÿÿô¿~·®
在系統B
ignoring .testfile.swp
filename = (null)
Segmentation fault
我可以在這個階段看到的唯一區別是變量名「」也許是沒有正確initialzed。但也許這沒有關係,也許我看錯了方向。
問題:
,我需要我用
strcpy
還是應該這只是工作之前,「準備」的指針?是否在兩個
gcc
版本之間存在限制?我只是編譯與gcc worklog.c -o worklog
是否有可能獲得更多的信息時調試輸出的方式,當segfault發生?
您需要用分配內存' malloc()'並設置'filename'指向它。否則,'strcpy()'應該複製到哪裏? – Barmar 2014-10-03 04:33:55
'char * filename;'不分配任何存儲; 'strcpy(filename,...)'將數據複製到隨機指針上,或者如果幸運的話可能是空指針。未定義的行爲 - 不好,不惜一切代價避免。 – 2014-10-03 04:34:26
謝謝,我會試試這個。任何想法爲什麼它不會在System_A上破壞?也許不正確,但我一直在使用它像這樣沒有問題多年.. – captcha 2014-10-03 04:35:34