当你使用array [i]访问数组的元素时,我认为C ++会在内存中占用数组的起始位置并添加i * sizeof(一个数组元素),然后取消引用该地址(或者做一些等效的事情)我刚刚描述的内容)。但是,在我看来,如果你有一个字符串数组(std :: string),根据字符串中的字符数,每个元素可以是不同的大小,所以必须有其他东西继续。
另外,据我所知,数组元素存储在连续的内存中。如果您将字符串存储在连续的内存中,然后将更多字符附加到其中一个字符串,则必须移动所有后续字符串。
有人可以向我解释这是如何运作的吗?
答案 0 :(得分:5)
字符串大小是常量,但它(在某种程度上)对某些非常量大小的数据有一个指针。
指针大小是常量,指针大小不是。
答案 1 :(得分:4)
std::strings
是对象。一个std::string
的大小与另一个std::string
的大小相同。它们通过动态分配间接地“包含”它们的数据,这不会影响拥有对象的大小。
同样,如果你的意思是C风格的字符串,实际上只传递char*
(或pointers-to-char
)。指针总是大小相同,无论它们指向的内存块的长度如何。
答案 2 :(得分:2)
std::string
是char*
的包装,而不是数组。数组可以是不同的大小,是的,但是char*
是指针并且具有恒定的大小。 char*
封装的std::string
指向动态分配的内存。这就是sizeof(std::string)
无论字符串增长多大都返回相同大小的原因。
答案 3 :(得分:1)
如果您正在引用C ++类型std::string
,则字符串数组中的每个元素都占用相同的内存量。但是,每个字符串可能包含指向内存中不同位置的指针,长度不同,它实际存储字符串。
要查看示例(示例代码),请想象std::string
类,如下所示:
struct string
{
size_t length;
const char* data;
// other members..
};
注意结构大小总是相同的(size_t
和指针),但是存储实际字符串的内存可能不同。
答案 4 :(得分:1)
字符串对象的大小会有所不同,具体取决于您的实现编译器等。您在评估c ++处理数组但忽略指针数据时是正确的。其内部的字符串类具有指向堆数据的指针,堆数据可以是任意大小,但指向该数据的指针是固定大小。因此,在字符串的数据布局中,编译器有一种方法可以创建具有非固定表示数据的统一对象。
答案 5 :(得分:0)
由于字符串是字符指针,因此字符串数组是(char *)
的数组 - (char *)
指针的连续向量。修改字符串将修改每个元素指向的内存。现在,如果您声明它是静态分配的:
char foo[10][10];
然后就内存布局而言,它与
无法区分char foo2[100];
并且可以通过写入超过声明的大小来破坏内存;这是使用std::string
而不是C风格字符串的一个原因,这可能是C为应用程序编程糟糕语言的最好例子。 (std::string
数组将是一个对象数组,每个对象都会在其中存储(char *)
,您无需担心 - std::string
为您做,更可靠。)
答案 6 :(得分:0)
这就是你在代码中的表现......
const int ARRSIZE = 5;
string arrayOfStr[ARRSIZE] = {"one", "two", "three"};
for (int i = 0; i < ARRSIZE; ++i)
{
cout << arrayOfStr[i] << endl;
}