![](/img/trans.png)
[英]Look for an elegant way to declare an array of struct with strings in C
[英]Best way to “declare” strings in C
我是C世界的新手(來自PHP)。 我正在玩字符串(我知道沒有這種類型的數據)。
我的問題是哪個是“聲明”字符串的最佳方式?
通過一些研究,我得出了這個結論。
char str[40] = "Here is my text";
char str[] = "Here is my text";
char *str = "Here is my text";
這取決於您的需求。
char str[40] = "Here is my text";
這將分配一個包含40個字符的數組。 將根據指定的字符串設置前15個字符。 其余的將被設置為空。 如果您稍后需要修改字符串,但是知道它不會超過40個字符(或者39個字符后面跟一個空終止符,具體取決於上下文),這非常有用。
char str[] = "Here is my text";
這與上面的示例相同,不同之處在於str
現在僅限於保存16個字符(15個字符串+空終止符)。
char *str = "Here is my text";
str
現在是一個指向15個字符的字符串的指針(加上一個空終止符)。 你不能修改字符串本身,但你可以在其他地方使用str
。 在某些環境中,這不是強制執行的,您實際上可以修改字符串內容,但這不是一個好主意。 如果確實需要使用指針並修改字符串本身,則可以復制它:
char *str = strdup("Here is my text");
但是你需要free(str)
或你的代碼會泄漏內存。
char str[40] = "Here is my text";
char str[] = "Here is my text";
str
是可修改的。 所以,
str[0] = 'M';
但,
char *str = "Here is my text";
str[0] = 'M'; // Not possible.
str
指向數據駐留在只讀段上,不可修改。 這一切都取決於你想要什么,字符串是否需要可修改。
我 char *str = "Here is my text";
一個。 該字符串將在只讀存儲器部分中創建。
灣 str
指針變量將在內存的堆棧部分中創建(假設所有這些都發生在函數內)
C。 str將指向在步驟'a'中創建的字符串的內存地址
因此,您無法修改以這種方式創建的字符串,因為它是在內存的只讀部分中創建的。 如果在創建此字符串后嘗試修改該字符串,則操作未定義,您將收到運行時錯誤。
解決這個問題的方法之一是strdup
。 strdup將在堆內存中創建一個字符串的副本,允許您自由地修改字符串。
例如:
char *fruit = apple //This will be created in const portion of memory,can't modify
char *copy = strdup(fruit) //This will create a copy of the string pointed by fruit in heap
記得在堆中釋放內存:免費(復制)
二 。 char str[40] = "Here is my text";
這將創建一個包含40個字符的數組。 前15個將根據給定的值設置,其余的將為空。 這將在堆棧內存中創建,因此您可以稍后修改該值。
例如,
str[0] = 'T'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.