C中的链接列表,最后一个节点指向NULL?

时间:2015-08-10 06:39:23

标签: c pointers null linked-list initialization

在C中,我是否必须始终初始化指向NULL的最后一个节点?我通常会在教程和书籍中看到这种情况。但根据我的理解,单位指针保持与NULL指针相同的地址。那么为什么要初始化?

6 个答案:

答案 0 :(得分:2)

  

但根据我的理解,未初始化的指针与NULL指针保持相同的地址

可能,(运气不好)。

在任何情况下,读出未初始化的指针都会调用未定义的行为。这是否会导致崩溃(或任何其他“奇怪”行为)迟早是未知的,例如未定义行为的性质。

然而,根据指针变量“生活”的内存如何分配,内存可能会“已经”初始化,如果分配

两种方法都提前分配内存和0。对于大多数最近的系统来说,这足以使得指针变量(存在于该存储器内)具有值NULL

但请注意,仍然可能有一些实现使用NULL不同的位模式,而不仅仅是0 - 位。因此,为了保持100%可移植性,总是明确地使用NULL进行初始化并且不依赖于隐式清除的内存是一个很好的建议。顺便说一句,这也有助于潜在的读者来源。

答案 1 :(得分:1)

当你创建一个指针而没有初始化它时,让我们说

char *ptr;

内存指向某些字节(取决于您的指针类型)。 那些字节可能是任何东西。像一些先前初始化的不一致指针,或者,对于一些垃圾。

这与NULL指针不同。

为了避免这种情况,你应该养成初始化每个指针的习惯(初始化为0的全局变量和静态除外),并且每次使用数组或包含多个元素的任何东西时都要添加NULL。 假设在这种情况下,NULL是数组/列表的'\ 0'。 例如,如果要创建包含几个char *的数组,请按以下方式执行:

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参数的字节清除可能存在于其中的垃圾。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可能认为空指针是未初始化的指针,但它是错误的。空指针是一个特殊指针,不指向任何地方。

if (!Array.prototype.includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

malloc()和getchar()等函数返回空指针,以防它们无法执行任务或完成任务。

答案 4 :(得分:0)

未初始化的指针可以保存任何垃圾值。

答案 5 :(得分:0)

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

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