如何向全局声明的char数组添加一些元素&从另一个函数访问数组的元素?
我在源文件中声明了这个
extern char *ArrayItems[] = {"Item1"};
功能1 - 将元素添加到数组
void AddSomeElementToGloablArray()
{
ArrayItems[1] = "Item 2";
ArrayItems[2] = "Item 3";
...
}
功能2 - 再将一些元素添加到数组
void AddSomeElementToGloablArray()
{
ArrayItems[3] = "Item 3";
ArrayItems[4] = "Item 4";
...
}
主要功能 - 访问数组元素
void Main()
{
AddSomeElementToGloablArray();
char *ItemValue = ArrayItems[3];
}
我尝试了上面的代码,但它没有返回添加的元素。在这里,我无法从函数传递或返回数组。 请任何人帮忙
答案 0 :(得分:5)
如何将元素添加到全局
char *Array[]
?
无法向数组添加元素。在数组的生命周期中,它的大小永远不会改变 - 没有任何元素被添加或删除。
解决这个问题的方法是间接:我们使用指向一个的指针而不是一个普通的静态/自动数组,并动态分配该数组。当你想要更多元素时,我们只需创建一个更大的新数组,将旧元素复制(可能通过移动)到新元素中并销毁旧数组。此数据结构通常命名为“可扩展数组”或“可调整大小的数组”。
当然,保持动态数组的裸指针是疯狂的,所以我们想要创建一个RAII包装类,使用适当的析构函数等来确保正确处理内存。在这一点上,我将指出标准库中存在可调整大小数组的这种包装器,因此您无需自己实现它:std::vector
。
extern char *ArrayItems[] = {"Item1"};
这是格式错误的,因为字符串文字无法转换为(非常量)char*
。
ArrayItems[1] = "Item 2";
这具有未定义的行为,因为索引超出了数组的范围。
答案 1 :(得分:3)
extern char *ArrayItems[] = {"Item1"};
我不确定这里是否需要extern
。如果您只在单个源文件中使用它,则不需要extern
。如果需要跨多个编译单元(源文件)共享变量,则应在头文件中使用extern
关键字声明它,然后在任何一个源文件中声明变量本身。
/* shared.h */
extern char *ArrayItems[];
/* foo.c */
char *ArrayItems[] = {"Item1"};
现在,向数组添加元素并非易事。您需要进行动态内存分配。如果您使用的是C ++,强烈建议您使用std::vector
。以下代码适用于支持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;
}
输出:
Item1
Foo
Bar
我使用char const *
代替char *
,因为"Item1"
是一个字符串文字,无论如何都不会在运行时修改。
答案 2 :(得分:1)
简短回答:不要这样做。使用std :: vector并调用vector.push_back。
长答案:使用[]声明的全局数组具有固定宽度,因此您不能通过访问它的元素编号来创建新成员,这非常危险,因为您正在访问超出范围内存。
答案 3 :(得分:0)
extern
关键字不为ArrayItems
分配任何内存。它只是一个声明而不是定义。如果在项目的某个其他文件中声明了此变量,并且要在当前文件中使用,则需要使用extern关键字进行声明。如果未在任何其他文件中定义此变量,则只需删除该关键字即可。你的代码会起作用。但是,如其他答案所示,使用全局变量并不是一个好主意。