繁体   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