在C++中如何可能有一个字符串数组

How is it possible to have an array of strings in C++?

本文关键字:有一个 字符串 数组 何可能 C++      更新时间:2023-10-16

当您使用array[i]访问数组的元素时,我认为C++会取数组在内存中的起始位置,添加i*sizeof(一个数组元素),然后取消引用该地址(或执行与我刚才描述的等效的操作)。然而,在我看来,如果你有一个字符串数组(std::string),每个元素的大小可能会根据字符串中的字符数而不同,所以肯定还有其他事情发生。

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

有人能向我解释一下这是怎么回事吗?

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

指针大小是恒定的,指针对象大小不是。

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

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

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