如何使用NULL初始化结构指针变量?

亚历山大·蒂莫申科(Aleksey Timoshchenko)

我有两个结构

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.

指针也是如此。他们可以指向任何地方。最后,结构的成员也是如此。

根据您的需求,有两种常见的方法可以解决这个“问题”。

  1. memset 整个事情归零:
struct hash_table m_hash_table;
memset( &m_hash_table, 0, sizeof(m_hash_table) );

结果:所有变量将为零,所有指针将为NULL 1

  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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章