我有两个结构
struct table_element
{
struct table_val * table_val_arr;
int count_arr;
};
struct hash_table
{
struct table_element table_element_arr[MAX_NUMBER];
};
这是我的测试方法
void test(struct hash_table * table)
{
int count;
struct table_element * tab_element;
for(count = 0; count < MAX_NUMBER; count++)
{
tab_element = &table->table_element_arr[count];
if(tab_element->table_val_arr == NULL)
{
printf("\nNULLLL!!!!!\n");
}
else
{
printf("\nOK!!!!!\n");
}
}
}
以及我如何使用它
int main(int argc, char **argv)
{
struct hash_table m_hash_table;
test(&m_hash_table);
...
我希望所有的价值都是NULL
,但是有时候我OK
有时会得到NULL
...
我究竟做错了什么?
如何用NULL初始化它?
如果您未在C中显式初始化变量,则该变量将具有未定义的值。例如。
int fish; // could be zero, -100, 3805, ...anything
int chips = 5; // will definitely be 5.
指针也是如此。他们可以指向任何地方。最后,结构的成员也是如此。
根据您的需求,有两种常见的方法可以解决这个“问题”。
memset
整个事情归零:struct hash_table m_hash_table;
memset( &m_hash_table, 0, sizeof(m_hash_table) );
结果:所有变量将为零,所有指针将为NULL 1。
struct hash_table m_hash_table;
for (int i = 0; i < MAX_NUMBER; i++)
{
m_hash_table.table_element_arr[i].table_val_arr = NULL;
m_hash_table.table_element_arr[i].count_arr = 0;
}
第三种选择是在声明结构时提供初始化,但是从逻辑上讲,它等效于选项2。
struct hash_table m_hash_table = { { NULL, 0 }, { NULL, 0 }, ... /*etc*/ };
1根据评论,确实存在一些体系结构,其中全零的位模式不等于NULL,因此该memset( ..., 0, ...)
方法不是严格有效的。但是,出于所有实际目的,在任何现代平台上,这都是一个完美有效的惯用解决方案。
(恕我直言,任何使用不正确的架构的人都不会在SO上寻求有关如何初始化其结构的建议!)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句