簡體   English   中英

C ++:為什么不能使用初始化程序char foo []將字符串轉換為C字符串?

[英]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.

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