Arrays 数组中元素的默认值是多少?

Arrays 数组中元素的默认值是多少?,arrays,c,scope,initialization,cs50,Arrays,C,Scope,Initialization,Cs50,我目前正在参加哈佛大学的CS50x课程,遇到了以下问题 在下面的简短摘录中,哈希表[i]是否默认设置为null?我的印象是,当我为10个节点分配足够的内存时(如下所示),我应该得到10个不同的地址,而不是空指针。然而,我正在学习的课程似乎表明,即使我为10个节点分配了足够的内存,也不会立即为它们分配地址。相反,它们将被分配空指针 typedef struct node { char word[N + 1]; struct node *next; } node; node *ha

我目前正在参加哈佛大学的CS50x课程,遇到了以下问题

在下面的简短摘录中,哈希表[i]是否默认设置为null?我的印象是,当我为10个节点分配足够的内存时(如下所示),我应该得到10个不同的地址,而不是空指针。然而,我正在学习的课程似乎表明,即使我为10个节点分配了足够的内存,也不会立即为它们分配地址。相反,它们将被分配空指针

typedef struct node
{
    char word[N + 1];
    struct node *next;
}
node;

node *hashtable[10];

数组中的元素

node *hashtable[10];
将由空指针初始化或不初始化,具体取决于数组的声明位置

如果数组具有自动存储持续时间,即如果它在函数中的代码块中声明,则其元素不会初始化,并且具有不确定的值

如果数组在文件作用域中声明(在任何函数之外),则它具有静态存储持续时间,并且其元素由空指针初始化

来自C标准(6.7.9初始化)

10如果具有自动存储持续时间的对象未初始化 显然,它的值是不确定的。如果对象具有静态 或者线程存储持续时间未显式初始化,则:

-如果有指针类型,则初始化为空指针;

-如果是聚合,则初始化每个成员(递归) 根据这些规则,任何填充都被初始化为零位


哈希表数组的初始化取决于其声明的位置和方式。如果hashtable是在函数外部声明的,则每个元素都被初始化为NULL(这本质上不指向任何内容)。如果hashtable是在函数中声明的,并且存储类为static,则也是如此。两者之间的唯一区别是后者只能在函数内部访问

node *hashtable[10]; /*each element is initialized to NULL*/

void f(void)
{
    static node *hashtable[10]; /*each element is initialized to NULL*/
    ...
}
如果哈希表是在函数内声明的,并且没有存储类static(即,是一个常规局部变量),则每个元素都是未定义的,这实际上意味着它可以有任何值:

void g(void)
{
    node *hashtable[10]; /*each element is undefined*/
    ...
}

造成这种差异的原因是,编译器可以免费初始化程序整个生命周期中存在的变量;变量被编译到可执行文件中。另一方面,每次调用函数时都需要初始化本地(非静态)变量,因此与运行时成本相关。

您会得到十个不同的地址,例如可以存储地址的十个空间。但它们仍然可以有相同的值,即指向相同的对象(或指向相同的缺少对象,即全部为空)。当然,存储在指针中的地址值也可以是无效的垃圾。但无论如何,指针当然不会指向节点,因为它们还没有指向任何节点。不管怎样,教科书对此怎么说?如何/是否初始化取决于声明的位置。具有静态存储持续时间且没有初始值设定项的指针初始化为空指针,不是空指针常量。@EricPostpischil来自C标准“如果将空指针常量转换为指针类型,则生成的指针称为空指针”,表示转换后的空指针常量是空指针。它并没有说空指针是一个空指针常量,转换或不转换。标准的相关部分将是C17 6.7.9/10“如果它有指针类型,则初始化为空指针;”。另请参见C标准允许C实现具有空指针的多个表示形式。空指针常量是源代码中的一个特定表达式。编译器在没有显式初始化器的情况下初始化指针时使用的表示形式不一定与它在null指针常量中使用的表示形式相同。