[英]C++: Is “my text” a std::string, a *char or a c-string?
[英]C++: Why can't I convert a string to C-string with an initializer char foo[]?
這是我的代碼:
const char readArr[] = readWord.c_str();
這給出了一個錯誤:數組初始化程序必須是初始化程序列表或字符串文字
我為什么要用
const char *readArr = readWord.c_str();?
出於同樣的原因,你不能
const char *p="foo";
const char readArr[]=p;
要么。 數組不是可以初始化的離散對象。 在C ++中唯一可以初始化的是離散對象,而數組本身並不是對象。 數組是連續存儲位置中的連續值列表的概念性地址。 在表達式中使用數組時,例如:
readArr[i]
數組的名稱衰減為指向數組第一個元素的指針。 現在,猜猜您寫這篇文章時做了什么:
const char *readArr = readWord.c_str();
好吧,您只是將指向第一個元素的指針存儲在一個字符數組中,該數組由readWord
std::string
。
在常規數組聲明中:
char readArr[]="Hello";
編譯器被賦予了字符串的長度,因此它初始化了一個連續的字符值列表,並readArr
加上了標簽readArr
。
const char readArr[] = readWord.c_str();
之所以不合法,是因為從指針初始化數組根本沒有意義。 指針本質上是一個內存地址:它指向一些數據,無論該數據是動態分配還是靜態分配(分別在“堆上”或“堆上”分配)。 指針不記錄那里有多少內存。
這會使C和C ++的新手感到困惑,因為該語言通常允許您將數組視為只是指向其第一個元素的指針。 這並不意味着數組只是指向他們的第一個元素。 他們不是。 但是,如果在表達式中使用它們,它們將衰減為指向其第一個元素的指針。
因為數組不是指針。 數組...是一個數組,句點。 char readArr[]
(就像char arr[4]
)直接在本地內存空間(函數的堆棧)中聲明某些內容,因此必須靜態分配某些內容。
str.c_str()在堆上的某個位置,因此無法正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.