如何在C ++中创建一个字符串数组?

时间:2011-05-30 22:57:30

标签: c++ arrays string

当你使用array [i]访问数组的元素时,我认为C ++会在内存中占用数组的起始位置并添加i * sizeof(一个数组元素),然后取消引用该地址(或者做一些等效的事情)我刚刚描述的内容)。但是,在我看来,如果你有一个字符串数组(std :: string),根据字符串中的字符数,每个元素可以是不同的大小,所以必须有其他东西继续。

另外,据我所知,数组元素存储在连续的内存中。如果您将字符串存储在连续的内存中,然后将更多字符附加到其中一个字符串,则必须移动所有后续字符串。

有人可以向我解释这是如何运作的吗?

7 个答案:

答案 0 :(得分:5)

字符串大小是常量,但它(在某种程度上)对某些非常量大小的数据有一个指针

指针大小是常量,指针大小不是。

答案 1 :(得分:4)

std::strings是对象。一个std::string的大小与另一个std::string的大小相同。它们通过动态分配间接地“包含”它们的数据,这不会影响拥有对象的大小。

同样,如果你的意思是C风格的字符串,实际上只传递char*(或pointers-to-char)。指针总是大小相同,无论它们指向的内存块的长度如何。

答案 2 :(得分:2)

std::stringchar*的包装,而不是数组。数组可以是不同的大小,是的,但是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;                  
}