![](/img/trans.png)
[英]Why do Windows and Linux have different strdup implementations: strdup() and _strdup()?
[英]Why do we need strdup()?
當我在完成任務時,我發現我們不應該使用如下任務:
char *s="HELLO WORLD";
使用這種語法的程序容易崩潰。
我嘗試過並使用過:
int fun(char *temp)
{
// do sum operation on temp
// print temp.
}
fun("HELLO WORLD");
甚至上面的工作(雖然輸出是編譯器和標准特定的)。
相反,我們應該嘗試strdup()或使用const char *
我曾嘗試在博客上閱讀其他類似的問題,但無法得到上述代碼為什么工作的概念。
內存分配? const有什么不同?
讓我們澄清一下事情。 你從來沒有特別需要strdup
。 它只是一個在堆上分配char*
的副本的函數。 它可以通過許多不同的方式完成,包括基於堆棧的緩沖區。 你需要的是結果,一個char*
的可變副本。
你列出的代碼很危險的原因是它將字符串文字中的一個真正的常量字符串傳遞給一個需要一個可變字符串的插槽。 遺憾的是,在C標准中允許這樣做,但這本身就很危險。 寫入常量字符串會產生意外結果並經常崩潰。 strdup
函數修復了這個問題,因為它創建了一個可變副本,它被放入一個期望可變字符串的插槽中。
字符串文字存儲在程序的數據段中。 操縱他們的指針將修改字符串文字,這可能導致...奇怪的結果充其量。 使用strdup()
將它們復制到堆或堆棧分配的空間。
字符串文字可以存儲在沒有寫權限的內存部分中。 嘗試寫入它們將導致未定義的行為。 const意味着編譯器確保不寫入指針,從而保證不以這種方式調用未定義的行為。
這是C中的一個問題。盡管字符串文字是char *
你不能修改它們,因此它們實際上是const char*
。
如果您使用的是gcc
,則可以使用-Wwrite-strings
來檢查是否正確使用了字符串文字。
閱讀我的答案(數組和字符串)Java和C之間的區別 。 它包含有關字符串的部分中您的問題的答案。
您需要了解靜態和內存分配之間存在差異,並且您不會求助於相同的內存空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.