当您处理C和其他具有指针的语言时,初始化指针会自动将其设置为null吗?

时间:2011-10-16 04:00:06

标签: c pointers

假设您已经定义了一个(全局或局部)指针变量,例如:

    void *this_is_a_pointer;

没有给它值“= NULL;”

这会自动给你一个NULL ptr(一个指向NULL的指针)吗?

* 另外,空指针指向NULL意味着什么?这是说它可以指向任何地方吗? (基本上, NULL 的地址位置是什么?)

4 个答案:

答案 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)

C Tutorial – More on Pointers

  

初始化指针

     

在使用指针之前,例如printf语句之前,你   必须初始化指针。以下示例不会   初始化指针:

#include<stdio.h> 

void main()

{

    int *ptr_p;

    printf("%d\n",*ptr_p);

}
  

注意:我们在声明函数main()时使用了void。所以没有回报   0;需要。 (当使用void时,某些编译器会发出警告   主要()。 GNU编译器会给出警告:返回类型为'main'   不是'int')。

     

在此示例中,我们打印ptr_p指向的值。但是,我们   没有初始化指针。在这种情况下,指针包含一个   随机地址或0。

     

该程序的结果是一个分段错误,其他一些   运行时错误或打印随机地址。一个意思   分段错误是你使用了指向一个指针   地址无效。

10.4 Null Pointers

  

在程序中“获取”空指针的最简单方法   是通过使用预定义的常量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值;它是底层系统用来表示明确定义的“无处”的值。当代码中出现空指针常量时,它将被空指针替换。

保证空指针值与任何有效指针值不相等。