簡體   English   中英

在C中將非常量參數傳遞給常量函數參數

[英]Passing non-const arguments to const function parameters in C

我有一個函數,它指定一個const參數來指示調用者它不會被修改:

int func1(const char *some_string) 
{
    // Do something non-destructive with some_string
}

我將一個非常量變量作為參數傳遞給func1

int func2(void)
{
    char *my_string = "my text";
    func1(my_string);
}

gcc報告:

warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]

處理這種情況的正確方法是什么? 創建my_string的const副本似乎有點多,但是簡單地進行鑄造似乎my_string了警告。

您遇到的問題源於您的main功能。

當您聲明char *my_string = "my text"; ,您正在創建指向字符串文字的非常量指針。 通過設計,字符串文字(例如"my text"是不可變的,因此在該語言中為const。 (實際上,編譯器通常將字符串文字放入包含只讀存儲器的可執行文件的特定部分中,因此嘗試使用非const指針修改文字可能會導致段錯誤。)

通過聲明一個指向字符串文字的非常量指針,您最終得到一個用於修改不可變字符串文字的指針,這在C語言中被視為未定義的行為。

有關更多信息,請參見此問題

解決此問題的最簡單方法是將char *my_string更改為const char *my_string

您可以使用const char *my_string = "my text"; 而不是char *my_string = "my text";

出現錯誤是因為使用-Wwrite-strings 額外警告編譯了項目。 默認情況下,任何常見的警告選項-Wall-Wextra都不會啟用此警告,因為它甚至可以使嚴格符合要求的 C程序生成診斷消息。

char *foo = "bar";

是一個嚴格符合C的片段, "bar"char [4]類型的不可修改數組。 但是,對於類型使用char *並不是最佳實踐,如果可能,應該使用const char *foo代替。 -Wwrite-strings使這種非最佳實踐可見 它只是作為編寫更好程序的助手,但它並沒有發現真正的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM