簡體   English   中英

當給定`const char *`作為第一個參數時,C標准庫函數`strchr`如何返回指向非const的指針?

[英]How come C standard library function `strchr` returns pointer to non-const, when given `const char *` as first argument?

使用gcc / g ++編譯給定的代碼示例成功。 strchr調用沒有錯誤,這顯然將const char *賦予char *

我發現strchr在兩個不同的源pubs.opengroup.orgcplusplus.com上聲明為char * strchr(const char *, int)

如果strchr被實現為拋棄strchr ,那為什么會這樣呢?

如果目標是提供對char *const char *字符串都起作用的函數 - 它可以使用兩個不同的函數名實現。

你能否對此作出更全面的解釋?

#include <string.h>

int main () {
    const char *str = "Sample string";
    char * ptr;

    //ptr = str;            //  Error: discards const qualifier - both on gcc and g++
    pch = strchr(str,'S');  //  Succeeds in assigning <const char *> to <char *>

    *pch = '4';             //  Runtime error: segmentation fault

    return 0;
}

使用MSYS2 / mingw-w64 gcc_v5.3.0和TDM-gcc32 v5.1.0在Win7上嘗試使用它。

當你使用char*調用strchr ,你想要一個char* ,這樣你就不需要對結果進行strchr了。 C不支持函數重載,因此使用相同的strchr函數在char*const char*進行搜索。 它在所有情況下都返回一個非const指針。 如果你用const char*調用它,它基本上拋棄了const因此調用者有責任安全地使用它(例如,通過立即將結果賦值給const char* ,以避免任何不安全的使用返回的指針)。

如果目標是提供對char *和const char *字符串都起作用的函數 - 它可以使用兩個不同的函數名實現。

是的,它可能是,但它沒有這樣做。 C的原始版本根本不支持const ,因此程序員始終有責任避免嘗試修改字符串文字。 如果使用了不同的函數名,那么它將破壞安全使用strchr現有代碼。 如果像這樣的傳統C代碼突然停止編譯,它會減慢新const關鍵字的采用速度:

char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';

“C的精神”是它不會試圖阻止你做不安全的事情,編寫正確的代碼是你的工作。

在C ++中, strchr被重載以保留strchr

char* strchr(char*, int);
const char* strchr(const char*, int);

這意味着它會自動執行正確的操作,並且使用strchr意外編寫不安全的代碼要困難strchr

暫無
暫無

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

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