2011-05-30 383 views
3

当你使用array [i]访问数组的元素时,我认为C++会在内存中取出数组的起始位置并添加i * sizeof(一个数组元素),然后解除引用该地址(或者做一些等同于我刚刚描述的)。然而,在我看来,如果你有一个字符串数组(std :: string),每个元素可以根据字符串中字符的数量而有不同的大小,所以一定还有别的东西在发生。根据我的理解,数组元素存储在连续的内存中。如果你将字符串存储在连续的内存中,然后将更多的字符添加到其中的一个字符中,则所有后续字符串都必须移动。如何在C++中创建一个字符串数组?

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

+0

发表一些*工作代码示例*。 “字符数组”和“数组std :: string”和“数组[指针]字符”等有区别。 – 2011-05-30 22:59:35

+0

当我说字符串时,我的意思是std :: string,而不是char *。 – user724107 2011-05-30 23:01:22

+0

@pst:没有看过之前使用过的短语“stdstr”。有趣。 – 2011-05-30 23:01:25

回答

5

字符串大小是恒定的,但它(在某个级别)有一个指针某些非常量大小的数据。

指针大小不变,指针大小不是。

2

std::stringchar*的包装,而不是数组。数组可以是不同的大小,是的,但是char*是指针并且具有恒定的大小。 std::string封装的char*指向动态分配的内存。这就是为什么sizeof(std::string)不管字符串增长多大都会返回相同的大小。

+0

它们不必是4或8个字节。 – 2011-05-30 23:00:59

+0

已更新我的回答 – Marlon 2011-05-30 23:09:35

1

如果引用的是C++类型std::string,则字符串数组中的每个元素都占用相同的内存量。但是,每个字符串可能包含一个指向内存中不同位置的指针,它们的长度不同,它实际存储字符串的位置。

要查看示例(示例代码),想象std::string类是这样的:

struct string 
{ 
    size_t length; 
    const char* data; 
    // other members.. 
}; 

注意结构尺寸如何始终是相同的(一个size_t和指针),但指向的内存,实际字符串的存储位置可能不同。

4

std::strings是对象。一个std::string的大小与另一个std::string的大小相同。它们通过动态分配间接“包含”他们的数据,这不会影响拥有对象的大小。同样,如果你的意思是C风格的字符串,你实际上只能传递char*(或pointers-to-char)。指针总是相同的大小,不管它们指向的内存块的长度。

+0

我认为这里需要注意的是,因为它的大小是重要的指针大小,这也意味着可以像在main(int argc,char ** argv)中那样拥有char **之类的东西,并迭代这些字符指针来获取实际的字符串。 – 2011-05-31 03:02:06

+0

@MikeBantegui:是的,这是一个指向C风格字符串数组中第一个元素的指针。这是我在第二段中谈到的。在这里需要注意的是'char * [N]'不是**和char [N] [M]'相同。 – 2011-05-31 08:23:56

1

字符串对象有一个大小,并且会根据您的实现编译器等而有所不同。您在评估谁C++处理数组,但忽略指针数据时是正确的。它的肠内的字符串类有一个指向堆数据的指针,堆数据可以是任意大小,但指向该数据的指针是固定的大小。因此,在字符串的数据布局中,编译器有一种方法可以创建具有非固定表示数据的统一对象。

0

由于字符串是字符指针,因此字符串数组是(char *)的数组 - (char *)指针的连续向量。修改一个字符串会修改每个元素指向的内存。现在,如果你宣称这是静态分配:

char foo[10][10]; 

然后在内存布局方面,它是无法区分

char foo2[100]; 

,并有可能破坏内存写过去的声明的大小;这是使用std::string而不是C风格的字符串的原因之一,这可能是为什么C是用于应用程序编程的糟糕语言的最好例子。 (中std::string数组是对象的数组,每个将具有存储在它(char *)的地方,你就不必担心 - std::string会为你,和更加可靠。)

0

这是你如何做代码...

const int ARRSIZE = 5; 
string arrayOfStr[ARRSIZE] = {"one", "two", "three"}; 

for (int i = 0; i < ARRSIZE; ++i) 
{     
    cout << arrayOfStr[i] << endl;     
} 
相关问题