Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
std:string如何防止我不小心踩到它的数据? 我有以下C++代码: #include <string> #include <iostream> int main(int argc, char** argv) { int size; std::string strArray[3]; std::string str0 = "String 0"; std::string str1 = "String 1"; std::string str2 = "String 2"; strArray[0] = str0; strArray[1] = str1; strArray[2] = str2; for (int i = 0; i < 3; i++) { std::cout << strArray[i] << std::endl; } str1.resize(200, 'a'); for (int i = 0; i < 3; i++) { std::cout << strArray[i] << std::endl; } std::cout << str1 << std::endl; std::cin.get(); return 0; } #包括 #包括 int main(int argc,字符**argv) { 整数大小; std::string strArray[3]; std::string str0=“string 0”; std::string str1=“string 1”; std::string str2=“string 2”; strArray[0]=str0; strArray[1]=str1; strArray[2]=str2; 对于(int i=0;i STD::String 是正则类型。 < P>数组是相邻的,字符串不是。_C++_Arrays_String - Fatal编程技术网 数组是相邻的,字符串不是。,c++,arrays,string,C++,Arrays,String" /> 数组是相邻的,字符串不是。,c++,arrays,string,C++,Arrays,String" />

std:string如何防止我不小心踩到它的数据? 我有以下C++代码: #include <string> #include <iostream> int main(int argc, char** argv) { int size; std::string strArray[3]; std::string str0 = "String 0"; std::string str1 = "String 1"; std::string str2 = "String 2"; strArray[0] = str0; strArray[1] = str1; strArray[2] = str2; for (int i = 0; i < 3; i++) { std::cout << strArray[i] << std::endl; } str1.resize(200, 'a'); for (int i = 0; i < 3; i++) { std::cout << strArray[i] << std::endl; } std::cout << str1 << std::endl; std::cin.get(); return 0; } #包括 #包括 int main(int argc,字符**argv) { 整数大小; std::string strArray[3]; std::string str0=“string 0”; std::string str1=“string 1”; std::string str2=“string 2”; strArray[0]=str0; strArray[1]=str1; strArray[2]=str2; 对于(int i=0;i STD::String 是正则类型。 < P>数组是相邻的,字符串不是。

std:string如何防止我不小心踩到它的数据? 我有以下C++代码: #include <string> #include <iostream> int main(int argc, char** argv) { int size; std::string strArray[3]; std::string str0 = "String 0"; std::string str1 = "String 1"; std::string str2 = "String 2"; strArray[0] = str0; strArray[1] = str1; strArray[2] = str2; for (int i = 0; i < 3; i++) { std::cout << strArray[i] << std::endl; } str1.resize(200, 'a'); for (int i = 0; i < 3; i++) { std::cout << strArray[i] << std::endl; } std::cout << str1 << std::endl; std::cin.get(); return 0; } #包括 #包括 int main(int argc,字符**argv) { 整数大小; std::string strArray[3]; std::string str0=“string 0”; std::string str1=“string 1”; std::string str2=“string 2”; strArray[0]=str0; strArray[1]=str1; strArray[2]=str2; 对于(int i=0;i STD::String 是正则类型。 < P>数组是相邻的,字符串不是。,c++,arrays,string,C++,Arrays,String,字符串对象的数组是连续的,但实际的字符串数据存储在heap*上,因此字符串数据本身不是连续存储的 *实际上,给定一个使用“小字符串优化”的实现,数据是连续的,只要足够小,就可以存储在字符串对象中。“String0”对于我所知道的所有SSO实现来说都足够小。一旦数据增长超过了可以存储的量,实现就会将其移动到堆中 修改str1不会影响打印strArray[1]的结果,原因是它们是不同的对象,没有任何关系,只是您使用str1的值初始化了strArray[1]。这与执行以下操作一样: int intAr

字符串对象的数组是连续的,但实际的字符串数据存储在heap*上,因此字符串数据本身不是连续存储的

*实际上,给定一个使用“小字符串优化”的实现,数据是连续的,只要足够小,就可以存储在字符串对象中。“String0”对于我所知道的所有SSO实现来说都足够小。一旦数据增长超过了可以存储的量,实现就会将其移动到堆中

修改
str1
不会影响打印
strArray[1]
的结果,原因是它们是不同的对象,没有任何关系,只是您使用
str1
的值初始化了
strArray[1]
。这与执行以下操作一样:

int intArray[3];
int int0 = 0;
int int1 = 1;
int int2 = 2;

intArray[0] = int0;
intArray[1] = int1;
intArray[2] = int2;

int1 = 10000000; // does not modify intArray[1]

这里的思想是C++中对象的通常行为与其他语言中可能熟悉的“原始类型”或“值类型”相同。在C++中可以实现其他行为,但是<>代码> STD::String 是正则类型。

< P>数组是相邻的,字符串不是。

您可以说
str1.resize(200,'a');
这对数组没有影响,因为数组包含
str1
以前不是
引用的


因此数组值不会溢出,因为数组中的值从未更改。

正如barnes53指出的那样,
string
数组只存储
string
对象,并且可以简单地保存指向表示字符串的字符数组的指针


第二个问题的答案是,数组赋值是通过值而不是通过引用来完成的,这意味着会生成字符串的副本。这就是为什么修改原始字符串对数组版本没有影响。

数组中的字符串与
str1
st不同r2
str3
。即使不是,一个字符串也不会溢出到另一个字符串中。否则没有人会使用
std::string
类。std::string
类的内部数据在堆上分配。应该注意,更改
str1
与更改
strArray[1]不同
@Jay,有许多不同的措辞方式,我们可以让OP决定他喜欢什么。虽然我们都知道我们表达的是相同的想法,OP可能会发现一种解释比另一种解释更清楚。libc++的小缓冲区对于“String0”来说太小了@SebastianRedl libc++在其SSO中最多支持22个
char
字符串:即使调整了数组值的大小,数组值也不会溢出。
resize
根据需要分配新内存,
std::string
永远不会“溢出”我刚才说的是arr[0]从未更改过,所以它不会溢出。