这是我的代码:
const char readArr[] = readWord.c_str();
这会产生错误:数组初始值设定项必须是初始化列表或字符串文字
为什么我必须使用
const char *readArr = readWord.c_str();?
答案 0 :(得分:2)
出于同样的原因你不能
const char *p="foo";
const char readArr[]=p;
任一。数组不是可以初始化的离散对象。在C ++中唯一可以初始化的是离散对象,而数组本身不是对象。数组是连续内存位置中连续值列表的概念地址。在表达式中使用数组时,例如:
readArr[i]
数组的名称衰减为指向数组中第一个元素的指针。现在,猜猜你写这篇文章时做了什么:
const char *readArr = readWord.c_str();
嗯,你只是存储了一个指向字符数组中第一个元素的指针,这个字符由readWord
std::string
拥有。
在常规数组声明中:
char readArr[]="Hello";
编译器被赋予字符串的长度,因此它初始化一个连续的字符值列表,并将标签readArr
初始化为它。
答案 1 :(得分:1)
const char readArr[] = readWord.c_str();
这不合法的原因是从指针初始化数组是没有意义的。指针本质上是一个内存地址:它指向某些数据,无论该数据是动态还是静态分配(分别在堆上'或'堆栈')。指针不记录那里有多少内存。
这对C和C ++的新手来说很困惑,因为该语言通常允许您将数组视为指向其第一个元素的指针。这并不意味着数组 只是指向其第一个元素的指针。他们不是。但是如果你在表达式中使用它们,它们将衰减指向它们的第一个元素的指针。
答案 2 :(得分:0)
因为数组不是指针。数组...是一个数组,句点。 char readArr[]
(就像char arr[4]
)直接在本地内存空间(对于函数的堆栈)声明一些东西,因此必须静态分配某些内容。
str.c_str()在堆上的某处,因此无法工作。