假设您已经定义了一个(全局或局部)指针变量,例如:
void *this_is_a_pointer;
没有给它值“= NULL;”
这会自动给你一个NULL ptr(一个指向NULL的指针)吗?
* 另外,空指针指向NULL意味着什么?这是说它可以指向任何地方吗? (基本上, NULL 的地址位置是什么?)
答案 0 :(得分:7)
(全球或本地)
这实际上是产生差异的原因。
通常,如果您没有初始化变量,那么它不会被初始化,并且从中读取它是未定义的行为。但如果变量具有静态存储持续时间,则它会自动初始化为零(指针为空)。
// foo.cpp
void* this_is_null;
void whatever(void)
{
static int* and_so_is_this;
}
void not_whatever(void)
{
float* but_this_local_is_uninitialized;
}
答案 1 :(得分:3)
绝对做不依靠此。调试模式下的编译器(具有正确的开关设置)通常会使堆栈中的变量为零,以便您跟踪错误,但最好显式初始化所有变量,而不仅仅是指针。
编辑:为了响应您的编辑,NULL的值定义为零。因此,它将指向地址0,在大多数现代操作系统中会导致分段错误或内存访问冲突。但是,在一些内存管理很少的嵌入式操作系统上,它可以让你改变地址0的内容!这个有点咬我几次;)
答案 2 :(得分:1)
初始化指针
在使用指针之前,例如printf语句之前,你 必须初始化指针。以下示例不会 初始化指针:
#include<stdio.h>
void main()
{
int *ptr_p;
printf("%d\n",*ptr_p);
}
注意:我们在声明函数main()时使用了void。所以没有回报 0;需要。 (当使用void时,某些编译器会发出警告 主要()。 GNU编译器会给出警告:返回类型为'main' 不是'int')。
在此示例中,我们打印ptr_p指向的值。但是,我们 没有初始化指针。在这种情况下,指针包含一个 随机地址或0。
该程序的结果是一个分段错误,其他一些 运行时错误或打印随机地址。一个意思 分段错误是你使用了指向一个指针 地址无效。
在程序中“获取”空指针的最简单方法 是通过使用预定义的常量NULL,它是由您定义的 几个标准头文件,包括,和 。要初始化指向空指针的指针,您可以使用 像
这样的代码#include
int * ip = NULL; &LT;并在检查之前测试它是否为空指针 您指向的值可能使用
之类的代码if(ip != NULL) printf("%d\n", *ip);
也可以引用null 通过使用常量0指针,您将看到一些设置的代码 只需执行
即可获得空指针int * ip = 0;
(实际上,NULL通常是预处理器宏 有价值,或替换文字,0。)此外,自从 C中“true”的定义是一个不等于0的值,你 将看到用缩写代码测试非空指针的代码 像
if(ip)printf(“%d \ n”,* ip);
这与我们的意思相同 上一个例子; if(ip)等于if(ip!= 0)和if(ip!= 空值)。所有这些用途都是合法的,虽然我推荐你 为了清晰起见,使用常量NULL,你会遇到另一个 表格,所以你应该能够识别它们。
答案 3 :(得分:1)
静态存储持续时间的指针将自动初始化为NULL。具有自动持续时间的指针不会被初始化,并且将包含可能与可能的内存地址对应或不对应的随机值:
#include <stdio.h>
int *p0; // File scope, initialized to NULL
int main(void)
{
static int *p1; // Declared "static", initialized to NULL
int *p2; // Auto, not initialized
printf("p0 = %p, p1 = %p, p2 = %p\n", (void *) p0, (void *) p1, (void *) p2);
return 0;
}
有空指针常量,它为0(宏NULL扩展为0值指针表达式)。有空指针值,可能是也可能不是0值;它是底层系统用来表示明确定义的“无处”的值。当代码中出现空指针常量时,它将被空指针值替换。
保证空指针值与任何有效指针值不相等。