我想知道是否可以動態分配字符串文字?動態分配字符串文字
我知道你能做到
char * letter = new char('b');
但有可能分配一個字符串字面一樣,
例如:
char * letter = new char("Hello");
我想知道是否可以動態分配字符串文字?動態分配字符串文字
我知道你能做到
char * letter = new char('b');
但有可能分配一個字符串字面一樣,
例如:
char * letter = new char("Hello");
什麼,你可以和應該做的是使用std::string並從字面初始化它像
std::string mystring{"Hello"};
當你這樣做,mystring
被分配在堆棧上,其內容是由"Hello"
(可能通過複製初始化,但請閱讀小字符串優化或短字符串優化)。
當該字符串被銷燬時(例如在包含塊的末尾),其存儲(也可能是內部副本,如果有的話)將被釋放。
如果你堅持有一個指向堆分配的C字符串的指針,你可以使用strdup
(然後用free
而不是delete
釋放它)。如果你想要的char
原始數組,你可以使用
char* p = new char[sizeof("Hello")]; // or new char[6]
strcpy(p,"Hello");
,但這僅適用於文字串像"Hello"
,你應該使用相同文字字符串"Hello"
兩次(或使用strlen("Hello")+1
代替sizeof("Hello")
,這是因爲零字節的終止而爲6)。
請注意,在所有情況下,您都不會動態分配字符串文字。允許編譯器(並且經常)將文字字符串放在生成的二進制文件executable的只讀code segment中。你可以做的是分配在堆充滿一個存儲區複製文字字符串的(或使用指針const char* pc = "hello";
)
謝謝,這是一個很好的解釋。 – anerk 2015-03-03 12:28:27
不,它是不是因爲當你正在寫作
char * letter = new char("Hello");
你正在聲明一個指向字符串的指針,但是給它賦值是一個不可能的常量字符。
那麼沒關係。 – anerk 2015-03-03 10:25:05
這是不正確的。實際上這是無意義的/毫無意義的。 – 2015-03-03 10:26:04
@ TheParamagneticCroissant:'錯誤:從'const char *'無效轉換爲'char'' – 2015-03-03 11:18:44
可以永遠分配文字,動態或其他方式。文字是文字;它們是根據定義烘烤的。
您可以動態地分配一個char
和,從文字初始化它,就像您在示例中所做的那樣。
至於你的問題,但是,從字符串字面量初始化是比較麻煩一些,因爲你可以從字符串字面量初始化使用正常初始化語法只能讓自己的char[N]
:
char[] str = "hello"; // special rules apply here
,這是不可能初始化一個動態分配的數組。在new[]
語法中沒有辦法做到這一點。
你可以指向動態分配給一個字符串:
const char** s = new const char*("hello");
但這是完全沒有用處。
我認爲你可以得到的最接近的是:
char* str = new char[5]{'h','e','l','l','o'};
但是,說實話,只使用一個std::string
代替:
std::string str("hello");
有人專門發明瞭解決這些各種問題。
感謝您的幫助! – anerk 2015-03-03 12:28:12
嘗試這樣
int size = 6;
char * letter = new char[size];
strcpy(letter, "Hello");
std::cout << letter;
delete[] letter;
但要記住刪除您的變量,因爲在「堆」
除2015年外,我們還沒有多年使用原始的'new []'和'delete []'。 '自動字母(std :: make_unique
我知道!問題不是關於std :: string – Garnik 2015-03-03 11:28:08
這個問題是關於動態分配一個字符串。這是_is_'std :: string'。你在這裏做的是教導過時和危險的方法。不負責任了! – 2015-03-03 11:28:30
什麼編程語言,你問這個分配本示例,變量「信」? – Hybris95 2015-03-03 10:08:53
這是爲C++。 – anerk 2015-03-03 10:09:55
你可以將你的只讀字符串轉換爲一個新的動態分配的字符串緩衝區? – Evert 2015-03-03 10:13:07