在C中,我是否必须始终初始化指向NULL的最后一个节点?我通常会在教程和书籍中看到这种情况。但根据我的理解,单位指针保持与NULL指针相同的地址。那么为什么要初始化?
答案 0 :(得分:2)
但根据我的理解,未初始化的指针与NULL指针保持相同的地址
可能,(运气不好)。
在任何情况下,读出未初始化的指针都会调用未定义的行为。这是否会导致崩溃(或任何其他“奇怪”行为)迟早是未知的,例如未定义行为的性质。
然而,根据指针变量“生活”的内存如何分配,内存可能会“已经”初始化,如果分配
calloc()
两种方法都提前分配内存和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.
初始化您定义的所有变量是一个很好的做法,否则,它可能会导致非常棘手的错误。