strlen
函數只接受一個類型爲const char*
的參數(這意味着它將接受非const
char*
參數)。
一些較舊的編譯器可能接受函數調用的參數個數不正確。您需要修復代碼。
這是假設您的代碼實際上使用strlen
。正如fernando.reyes在評論中建議的那樣,很可能你的意思是strcpy
而不是strlen
(特別是因爲你不使用結果;調用strlen()
而放棄結果沒有多大意義)。
在這種情況下,問題是stringLiteralPointer
指向(與數組對象關聯的)字符串文字。試圖修改這樣的數組有未定義的行爲。一些編譯器可能會將字符串文字放在讀/寫內存中,但不應該依賴於此。
此外,解決方案是修復您的代碼。您需要安排stringLiteralPointer
指向不是字符串文字的數組。一種方法是使用malloc
分配足夠的空間(並確保檢查malloc
返回的指針非空)。如果你的指針已經指向字符串,你也可以使用非標準的strdup
函數,它試圖分配一個新的字符串讀/寫副本並返回一個指向它的指針。同樣,您需要確認分配成功。
另一種選擇可能是使用數組而不是指針。這:
char *ptr = "literal";
導致ptr
指向一個字符串,你不允許修改。這:
char arr[] = "literal";
使arr
數組包含字符串文字的讀/寫副本。
和請確保您問題中的代碼是您正在編譯的實際代碼。複製並粘貼它,不要重新輸入。 Please read this。
更一般地說,gcc有許多選項來啓用額外的警告。如果你用類似的方式編譯你的代碼:
gcc -std=c99 -Wall -Wextra -O3 ...
你可能會在你的代碼中發現一些有問題的東西。 -std=c99
選項告訴gcc(嘗試)符合1999 ISO C標準;如果您的代碼旨在符合C90(通常不正確地稱爲「ANSI C」),請使用-ansi
而不是-std=c99
。 -O3
選項啓用最大優化級別;這會導致編譯器執行額外的分析,也可以啓用更多警告。
有許多C檢查器比大多數編譯器執行更多的分析。 Lint是原始工具。 Splint(以前稱爲LCLint)是一種現代化的實施方式,可免費獲得here或(可能)通過系統的軟件包管理器。
我想你的意思是strcpy –
Gcc 3.4.6在編譯器中也很古老。 – Novelocrat
我認爲靜態代碼驗證可以在這種情況下產生很大的好處,我推薦cppcheck,它可以讓您對錯誤代碼有很多瞭解,而不僅僅是遷移錯誤 –