![](/img/trans.png)
[英]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.