2012-04-10 68 views
0

我發現,似乎帶來一些麻煩的遺留項目下面的代碼:使用tolower()將char *字符串轉換爲小寫會導致SIGSEGV - 出現了什麼問題?

for(; *str; ++str) 
    *str = tolower(*str); 

麻煩的是,我們得到了一個SIGSEGV此刻tolower的(結果)應該被寫入回* str。這是我使用printf()調試和stracktrace產生的結果,因爲我們在這裏使用JNI,因此將一個調試器附加到C庫並不適合我們。

如果在Linux上使用gcc進行編譯,則代碼將失敗。在windows上運行相同的東西(CMake被用於這個跨平臺設置)工作正常。

我在哪裏可以找到原因?任何提示讚賞:)

謝謝 - 馬庫斯

+0

什麼是'str'指向?不是字符串常量? – 2012-04-10 09:21:14

+0

它傳遞到我的函數:myfunction(char * str) – Markus 2012-04-10 09:22:55

+0

'my function'=>您無法控制調用者? – ArjunShankar 2012-04-10 09:23:53

回答

2

字符串常量是不可修改的:

char blop[] = "modifiable string"; 
char *bla = "non-modifiable string"; 

*blop = tolower(*blop); // OK 
*bla = tolower(*bla); // not OK, modifying a string literal 
+0

+1,但'tolower()'函數不期望'char *'並且不會修改任何內容;-)你的意思是OP在上面的註釋中稱之爲'myfunction()'。 – 2012-04-10 09:30:29

+0

@ MichaelKrelin-hacker謝謝,更新 – ouah 2012-04-10 09:31:52

+0

http://c-faq.com/decl/strlitinit.html – ArjunShankar 2012-04-10 09:35:09

相關問題