链表在C中,最后一个节点指向NULL



在C中,我必须始终初始化指向NULL的最后一个节点吗?我通常在教程和书籍中看到这种情况。但据我所知,一个统一的指针和一个NULL指针拥有相同的地址。那么为什么要初始化呢?

但据我所知,未初始化的指针与NULL指针具有相同的地址

运气可能不好。

在任何情况下,读取未初始化的指针都会调用未定义的行为。这是否会迟早导致崩溃(或任何其他"奇怪"行为(,正如未定义行为的性质一样,尚不清楚。

然而,根据指针变量"居住"的内存的分配方式,如果分配,内存可能会"已经"初始化

  • 静态或
  • 通过呼叫calloc()

这两种方法都预先分配内存和0。对于最新的系统来说,这足以让一个指针变量(位于该内存中(携带NULL的值。

但请注意,仍然可能有一些实现对NULL使用不同的比特模式,而不仅仅是0比特。因此,为了保持100%的可移植性,最好始终显式地使用NULL初始化,而不是依赖于隐式清除的内存。顺便说一句,这也有助于潜在的读者了解你的消息来源。

当您在不初始化指针的情况下创建指针时,比如

char *ptr;

内存指向一些字节(取决于您的指针类型(。这些字节可以是任何东西。就像以前初始化的未解冻指针,或者指向一些垃圾。

这与NULL指针不同。

为了避免这种情况,您应该养成初始化每个指针的习惯(初始化为0的全局指针和静态指针除外(,并且每次处理数组或任何包含多元素的东西时都添加一个NULL。假设在这种情况下,NULL是数组/列表的"\0"。例如,如果你想创建一个包含几个字符*的数组,可以这样做:

void function()
{
 char *array[4];
 array[0] = strdup("Jason");
 array[1] = strdup("Mike");
 array[2] = strdup("Nicole");
 array[3] = NULL;
}

它可以帮助您避免超出先前为此指针分配的内存,避免内存故障和分段错误。以防您使用计数器来遍历此数组的每个事例。

否则,不要在任何地方都使用NULL,如果您分配了一个字符串,则在打开后不要用NULL填充。

int main()
{
    char *ptr;
    if ((ptr = malloc(sizeof(char) * 42)) == NULL)
        return (-1);
    ptr = NULL;
 return (0);
}

这不会起作用,因为您正在将NULL发送到之前直接清理的字节中。如果要正确使用指针并在使用前对其进行清理,可以使用memset。这将向指针中发送x个相同字节,通过传递到memset参数中的字节清除其中可能存在的垃圾。

您可能认为null指针是未初始化的指针,但这是错误的。空指针是一个不指向任何位置的特殊指针。

//  To declare a null pointer.
int *ptr=NULL;

if(ptr==NULL) //..do something..

malloc((和getchar((等函数在无法执行任务或完成任务时返回空指针。

未初始化的指针可以容纳任何垃圾值。

未初始化的局部变量的值未定义。而静态或全局将被授权为0。

初始化您定义的所有变量是一种很好的做法,否则,可能会导致非常非常棘手的错误。

与您的理解相反,未初始化指针的内容是未定义的。只有当对象被静态地分配时,它才能保证初始化为零。

相关内容

  • 没有找到相关文章