C ++:为什么我不能用初始化器char foo []将字符串转换为C-string?

时间:2016-10-01 00:56:37

标签: c++

这是我的代码:

const char readArr[] = readWord.c_str(); 

这会产生错误:数组初始值设定项必须是初始化列表或字符串文字

为什么我必须使用

const char *readArr = readWord.c_str();?

3 个答案:

答案 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()在堆上的某处,因此无法工作。