我正在实现需要指针数组的基数排序,为了避免分段错误,我必须将其初始化为 NULL。
当我尝试: struct Node *Bucket[10] = NULL
但它给出了:error: invalid initializer
所以,我的老师建议: struct Node *Bucket[10] = {0}
所以我的问题是 {0} 和 NULL 之间有什么区别,我也试过:
struct Node *Bucket[10] ;
for(int i=0 ; i<10 ; i++)
{
Bucket[i] = NULL ;
}
Run Code Online (Sandbox Code Playgroud)
{0} 如何与 for 循环相同
编辑1:
还有一个问题,为什么我们将 Bucket[0] .. Bucket[9] 设为 NULL 以及它如何防止分段错误。
void Radix_Sort(int *Arr)
{
int max ;
max = Max_element_in_array(Arr);
struct Node *Bucket[10] = {0} ;
for(int exp = 1 ; max / exp > 0 ; exp*=10)
{
int k=0 ;
for(int i=begin ; i<end ; i++)
{
Append_a_linked_list(&Bucket[(Arr[i]/exp)%10],Arr[i]);
}
for(int j=0 ; j<10 ; j++)
{
while( Bucket[j] )
{
Arr[k++] = Delete_first_node(&Bucket[j]);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
花括号{ ... }用于数组初始化。当你声明一个数组时,你可以用这样的语法初始化它的元素:
int a[3] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
其中三个成员,分别设置a[0] = 1,a[1] = 2和a[2] = 3。
如果列表包含的值少于数组的元素,则所有剩余元素都初始化为零。从上面给出的链接:
所有未显式初始化的数组元素都以与具有静态存储持续时间的对象相同的方式隐式初始化。
您的指针数组有 10 个元素,但初始值设定项列表中只有一个值,因此所有其他元素都设置为零(明确表示第一个元素也是如此)。
您的使用NULL实际上并不是问题本身,正如您所写的(更清楚的是,恕我直言):
struct Node *Bucket[10] = {NULL, };
Run Code Online (Sandbox Code Playgroud)
因为NULL宏通常是这样定义的:
#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)
注意:我在初始化列表中提供的尾随逗号是可选的,但(再次,恕我直言)清楚地表明(呃)您知道数组中有更多元素,并且您有意使用“隐式初始化为零”的规则'。有关讨论,请参见此处:编程语言语法中尾随逗号的历史。
随时要求进一步澄清和/或解释。