2010-08-13 66 views
1

请原谅我,如果这是一个愚蠢的问题,我对C相当陌生,并且无法找到这个在线的例子,所以我假设我无法做到我想要。但是,希望这里有人能指引我走向正确的方向。在头文件中定义一个结构在它的声明中的值

,所以我必须声明,像这样

typedef struct{ 

    float *float_array1; 

    float *float_array2; 

    int anInt; 

    int anotherInt; 

}IMAStruct; 

IMAStruct aStruct; 

我想ANINT总是被初始化为当结构声明0一个struct一个headerfile,浮子阵列MEM被分配根据是否是1或0;

问题是我正在处理一个巨大的项目,这个代码是用在一个动作侦听器中的,我真的不能修改代码的任何其他部分。我只希望它运行一次代码,然后跳过它。这似乎是一个很好的做法。

回答

1

这不是你应该在标题中做的事。

问题是该结构的声明不执行任何代码。调用malloc或制作条件分支需要执行代码。

现在,你可以把它在GCC无论如何发生通过声明这样的函数:

void initAStruct __attribute__((init)) { 
    aStruct.anInt = 0; 
    aStruct.float_array2 = (float*)malloc(sizeof(float)*10); 
} 

在C99,我认为这是可以与float float_array2[anInt*10];做,但你不能这样做,在C89。

0

我不太清楚你想要什么,但是因为这是C而不是C++,所以你需要编写一个函数来以你想要的方式初始化你的结构。 C没有办法指定结构的每个实例都以特定的初始化开始。你可以定义一个常量初始化器(作为一个宏),并要求该结构的所有用户都用它初始化它,但是当你需要动态分配时它不会工作。

+0

那么我需要2个浮点数组进行动态分配。但Ints只是设置..我可能jjust拉出整型结构,这将更容易处理我认为。 – 2010-08-13 16:52:05

+0

我想我可以检查一下数组是否已经初始化......但是我无法完全弄清楚如何做到这一点,任何想法? – 2010-08-13 16:55:18

+0

如果您零初始化结构的新实例(提示:静态/全局变量始终为零初始化),那么您可以检查数组指针是否为NULL。 – 2010-08-13 17:14:43

0

如果结构是在文件范围(即在任何函数之外)(或在函数中,如果它是static)定义的,那么它总是以相同的方式初始化:整数和浮点字段被初始化为0,并且指针字段初始化为NULL(这适用于嵌套结构和联合递归)。

如果结构是在一个函数中定义的(“在堆栈上”或在堆中分配的“malloc”),这些字段不会自动初始化,并且它们首先包含发生在这些预先记忆的位。

没有可移植的方式来指定程序初始化代码;如果您的程序启动时需要运行某些内容,则必须将其放入main。但是,有些平台确实为此提供了不可移植的扩展。

0

到处无论只是初始化它的文件或功能范围是这样的:

IMAStruct aStruct = { 0 }; 

这保证了所有字段都被初始化为0NULL的指针。然后,您可以轻松检测变量是否尚未初始化并触发初始化。

在文件范围内,这样的初始化是多余的,但我认为在任何地方坚持使用相同的初始化规则会更容易。

相关问题