如何在C或C ++中全局初始化数组?
我正在尝试这样做:
for(int k=0; k<context.size(); k++) { cc_no_issue[k]=0; }
有人能告诉我如何在全球范围内做到这一点吗? 每当我尝试时,我都会收到以下错误:
在“for”之前预期的不合格ID
k没有定义类型
k没有定义类型
这样做:
long cc_no_issue[100]={0};
这是正确的初始化 。
注意:这会将所有内容初始化为0。
这个句子:
long cc_no_issue[100]={1,2};
将cc_no_issue[0]
设置为1, cc_no_issue[1]
为2,其余设置为0.您可以看到上面的链接以获取更多信息。
如果你有一个基本类型的全局数组,
int some_array[1000];
它将自动初始化为零。 您不必初始化它。 如果你确实需要运行初始化代码,你可以像下面这样做(在C ++中):
struct my_array_initializer { my_array_initializer() { // Initialize the global array here } }; my_array_initializer dummy_variable;
如果您使用的是GCC(或Clang),则可以在main
之前使用constructor
属性执行代码:
__attribute__((constructor)) void initialize_array() { // Initialize the global array here }
不,你不能拥有function之外的代码。
你可以将它放在一些函数中并从main
的开头调用它。
一种方法是添加一个全局函数:
- 检查arrays是否已初始化
- 如果数组未初始化,则初始化该数组
- 返回数组
示例代码:
int* get_cc_no_issue() { if(!kIsMyArrayInitialized) { /* todo: somehow get "context" globally... */ for(int k = 0; k < context.size(); k++) { cc_no_issue[k] = 0; } kIsMyArrayInitialized = true; } return cc_no_issue; }
如果要进行非零初始化,这非常有用。
对于零初始化,请参阅另一个问题的答案: 全局内存是否在C ++中初始化?
默认情况下,所有全局变量(文件范围内的变量)都初始化为零,因为它们具有静态存储持续时间(C99 6.7.8.10)。 所以严格来说,你不需要将它们初始化为零,C标准保证它们默认为零。
然而,如Ziyao Wei的回答所述,明确初始化它们是一种很好的编程习惯。
您可以将数组放在全局对象的构造函数中。
int cc_no_issue[256]; struct Init { Init(int a, unsigned int size) { memset(a, 0, size); } }; Init arr(cc_no_issue, sizeof(cc_no_issue));
作为@Bo Persson,请在函数中执行此操作。 但是,已经有一种算法可以在C ++中为您完成。 无需编写手写循环。
std::fill(cc_no_issue, cc_no_issue+context.size(); 0) ;
有关std :: fill的更多信息
回复你的评论:
要递增每个元素,可以使用std :: for_each将函数对象作为第三个参数传递。
#include #include using namespace std; void incrementHelper( int& a ){ ++a; } int main(){ int ar[] = { 1,2,3,4,5 }; for_each(ar, ar+5, incrementHelper ); for( int i=0; i
输出继电器:
2 3 4 5 6
for_each(ar,ar + 5,incrementHelper);
对于数组中的每个元素,算法将调用函数incrementHelper
。 在C术语中,它可以作为数组中每个元素的回调。 现在回调函数,通过引用接收传递的元素。 因此,修改引用也将修改引用。 请参阅在线演示。
你需要决定语言。 这种机制在C和C ++中是不同的。 基本上C在主函数启动之前没有运行代码的方法,所以你不能在C中对数组进行复杂的初始化。在C ++中你有一些选项,一个是停止使用裸数组(无论如何都是C结构)而是将您的数组包装在一个类中,并在类构造函数中进行初始化。
CC cc_no_issue; class CC { public: CC() { // initialisation of array goes here } private: int array[100]; };
另一种使用向量的方法,并编写一个函数来初始化向量。
std::vector cc_no_issue = init_vector(); std::vector init_vector() { std::vector tmp; // initialisation of tmp goes here return tmp; }