在C++中如何可能有一个字符串数组
How is it possible to have an array of strings in C++?
当您使用array[i]访问数组的元素时,我认为C++会取数组在内存中的起始位置,添加i*sizeof(一个数组元素),然后取消引用该地址(或执行与我刚才描述的等效的操作)。然而,在我看来,如果你有一个字符串数组(std::string),每个元素的大小可能会根据字符串中的字符数而不同,所以肯定还有其他事情发生。
此外,据我所知,数组元素存储在连续内存中。如果将字符串存储在连续内存中,然后在其中一个字符串上附加更多字符,则所有后续字符串都必须移到上面。
有人能向我解释一下这是怎么回事吗?
字符串大小是恒定的,但它(在某种程度上)有一个指向一些非恒定大小数据的指针。
指针大小是恒定的,指针对象大小不是。
std::strings
是对象。一个std::string
的大小与另一个std::string
的大小相同。它们通过动态分配间接地"包含"数据,而动态分配不会影响所属对象的大小。
类似地,如果您指的是C风格的字符串,那么实际上只传递char*
(或pointers-to-char
)。指针的大小总是相同的,无论它们指向的内存块的长度如何。
std::string
是char*
的包装器,而不是数组。数组可以有不同的大小,是的,但是char*
是指针,并且具有恒定的大小。std::string
封装的char*
指向动态分配的存储器。这就是为什么无论字符串增长到多大,sizeof(std::string)
都会返回相同的大小。
如果您引用的是C++类型std::string
,字符串数组中的每个元素都占用相同的内存总量。然而,每个字符串可能包含一个指针,指向内存中不同的位置,长度不同,实际存储字符串的位置。
要查看示例(示例代码),请想象std::string
类如下:
struct string
{
size_t length;
const char* data;
// other members..
};
请注意,结构大小总是相同的(size_t
和指针),但实际字符串所指向的内存可能不同。
字符串对象有一个大小,根据您的实现编译器等的不同而有所不同。您对c++处理数组的人员的评估是正确的,但忽略了指针数据。字符串类内部有一个指向某些堆数据的指针,这些堆数据可以是任意大小的,但指向该数据的指针是固定大小的。因此,在字符串的数据布局中,编译器有一种方法可以创建具有非固定表示数据的统一对象。
由于字符串是字符指针,因此字符串数组是(char *)
的数组——(char *)
指针的连续向量。修改字符串将修改每个元素指向的内存。现在,如果您声明它是静态分配的:
char foo[10][10];
那么就存储器布局而言,它与是无法区分的
char foo2[100];
并且有可能通过写入超过声明的大小来破坏存储器;这就是应该使用std::string
而不是C风格字符串的原因之一,这可能是C语言在应用程序编程中糟糕的最好例子。(std::string
的数组是一个对象数组,每个对象中都有一个(char *)
存储在某个你不需要担心的地方——std::string
为你做这件事,而且更可靠。)
这就是代码中的操作方式。。。
const int ARRSIZE = 5;
string arrayOfStr[ARRSIZE] = {"one", "two", "three"};
for (int i = 0; i < ARRSIZE; ++i)
{
cout << arrayOfStr[i] << endl;
}
- 如何检查一个c++字符串中有多少相同的字符/数字
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 对于C字符串,是否有一个标准的C++迭代器
- 我有一个字符串变量单词= "APA"
- 从 c++ 库中获取一个字符串,周围有一个 java 包装器
- C++从文件中读取不同类型的数据,直到有一个以数字开头的字符串
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 指针怎么能有一个字符串作为它的值
- 是否有函数/WinAPI 可以判断一个字符串是否以不区分大小写的语言方式以另一个字符串开头?
- 我有一个构造函数,但我需要将输出返回到 main.cpp.我无法使用获取字符串功能!!任何想法如何实现这一目标?
- 从C 中的线路读取(每行都有一个字符串和几个INT值)
- 在系统()中有一个字符串
- 如果我有一个字符串向量,如何使用带execvp的字符串来执行命令
- 从文件中读取数据,该文件每行都有一个字符串,其中可能有也可能没有整数
- 从文件中读取整数,中间有一个字符串
- 有一个字符串如何从第一个' /r/n/r/n '得到它的内容,直到2行从字符串结束
- 在C++中如何可能有一个字符串数组
- 有一个字符串映射如何将其与给定的字符串进行比较