C++ 如何将元素添加到全局字符*数组[]?

C++ 如何将元素添加到全局字符*数组[]?,c++,arrays,C++,Arrays,如何向全局声明的char数组中添加一些元素&从另一个函数访问数组的元素 我在源文件中这样声明 extern char *ArrayItems[] = {"Item1"}; 功能1-将元素添加到数组中 void AddSomeElementToGloablArray() { ArrayItems[1] = "Item 2"; ArrayItems[2] = "Item 3"; ... } void AddSomeElementToGloablArray() { ArrayItems

如何向全局声明的char数组中添加一些元素&从另一个函数访问数组的元素

我在源文件中这样声明

extern char *ArrayItems[] = {"Item1"};
功能1-将元素添加到数组中

void AddSomeElementToGloablArray()
{
  ArrayItems[1] = "Item 2";
  ArrayItems[2] = "Item 3";
...
}
void AddSomeElementToGloablArray()
{
  ArrayItems[3] = "Item 3";
  ArrayItems[4] = "Item 4";
...
}
功能2-再次向数组中添加一些元素

void AddSomeElementToGloablArray()
{
  ArrayItems[1] = "Item 2";
  ArrayItems[2] = "Item 3";
...
}
void AddSomeElementToGloablArray()
{
  ArrayItems[3] = "Item 3";
  ArrayItems[4] = "Item 4";
...
}
主要功能-访问阵列元素

void Main()
{
  AddSomeElementToGloablArray();
  char *ItemValue = ArrayItems[3];
}
我尝试了上面的代码,但它不返回添加的元素。在这里,我无法从函数传递或返回数组。
请任何人帮忙

简短回答:不要那样做。使用std::vector并调用vector.push_


详细回答:使用[]声明的全局数组具有固定宽度,因此您不能通过访问其元素号来创建新成员,这是非常危险的,因为您正在访问越界内存。

extern
关键字不会为
ArrayItems
分配任何内存。它只是一个声明,而不是一个定义。如果此变量在项目中的其他文件中声明,并且要在当前文件中使用,则需要使用extern关键字声明。如果此变量未在任何其他文件中定义,则只需删除该关键字即可。你的代码会工作的。然而,正如其他答案所建议的,使用全局变量不是一个好主意

如何将元素添加到全局
char*数组[]

无法将元素添加到数组中。在一个数组的生命周期内,它的大小永远不会改变——不会添加或删除任何元素


解决这个问题的方法是间接寻址:我们使用指向一个数组的指针并动态分配该数组,而不是简单的静态/自动数组。当您需要更多元素时,我们只需创建一个新的、更大的数组,将旧元素复制(可能通过移动)到新数组中,然后销毁旧数组。此数据结构通常命名为“可增长数组”或“可调整大小的数组”

当然,维护指向动态数组的裸指针是疯狂的,因此我们希望创建一个RAII包装类,并使用适当的析构函数等来确保正确处理内存。此时,我要指出,标准库中存在用于可调整大小数组的此类包装器,因此无需您自己实现:
std::vector


这是格式错误的,因为字符串文字无法转换为(非常量)
char*

这具有未定义的行为,因为索引在数组的边界之外

extern char *ArrayItems[] = {"Item1"};
我不确定这里是否需要
extern
。如果只在单个源文件中使用它,则不需要
extern
。如果需要跨多个编译单元(源文件)共享变量,则应使用
extern
关键字在头文件中声明变量,然后在任何一个源文件中声明变量本身

/* shared.h */
extern char *ArrayItems[];
/* foo.c */
char *ArrayItems[] = {"Item1"};
现在,向数组中添加元素并不是一件小事。您需要进行动态内存分配。如果您使用C++,则强烈建议您使用<代码> STD::vector < /C>。以下代码在支持C++11的标准编译器中工作

#include <vector>
#include <iostream>

std::vector<char const *> ArrayItems = {"Item1"};

void AddSomething()
{
    ArrayItems.push_back("Foo");
    ArrayItems.push_back("Bar");
}

int main()
{
    std::cout << ArrayItems[0] << std::endl;
    AddSomething();
    std::cout << ArrayItems[1] << std::endl;
    std::cout << ArrayItems[2] << std::endl;
    return 0;
}
我使用
char const*
而不是
char*
,因为
的“Item1”
是一个字符串文本,无论如何在运行时都不能修改它

Item1
Foo
Bar