簡體   English   中英

在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.

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