一个新的声明指针,它指向哪里?

时间:2013-10-27 17:32:15

标签: c pointers

我现在正在学习C,这些天我正在学习指针,我只是提出一个问题!

int *ptr;       //declare the ptr
ptr = &var;     //init the ptr with the address of the variable var

使用这些行,我创建了一个指针,并将ptr与变量相关联。我的问题是,当我声明一个指针int *ptr;并且我没有用地址初始化它时,这个指针指向它?

6 个答案:

答案 0 :(得分:2)

它就像任何其他未初始化的局部变量一样 - 它未指定位置或它包含的值,并且在初始化之前不允许使用它(例如,取消引用它)。正如@ WhozCraig的评论中所述,几乎所有其他操作都被禁止(使用指针的值,包括算术和比较)。未初始化的非指针变量(即使是那些具有简单类型的变量,如int s)也不能用于访问其值的任何操作。

答案 1 :(得分:2)

在C中,除非您特别说明,否则通常不会初始化变量:

int a;                 // not initialized
int b = 1;             // initialized

int arr[10];           // not initialized
int brr[4] =  { 1 };   // initialized as { 1, 0, 0, 0 }

void * p;              // not initialized
void * q = &a;         // initialized

(对于具有静态或线程局部存储的变量,存在异常,这些变量始终为零初始化。)

不允许尝试获取未初始化变量的。您可以对未初始化的变量执行的唯一操作是分配给它,它不访问其当前值,而只是为其分配新值。在初始化或赋值之前,变量的当前值是“不确定的”,您不能尝试访问它。这样做会导致未定义的行为。

所有变量都是如此,但特别适用于指针变量。在您指定一个之前, 没有任何有意义的值。

void * p;              // not initialized

if (p) { /*...*/ }     // undefined behaviour!
printf("%p\n", p);     // undefined behaviour!

p = &a;                // now p has a well-defined value

导致未定义行为的操作的技术术语是所谓的“左值转换”。这是您获取命名变量(“左值”)并使用其内容的时刻。例如。 C11,6.3.2.1/2说:

  

如果左值指定一个自动存储持续时间[...]和该对象的对象   未初始化(未使用初始化程序声明,并且没有对其进行任何分配)   在使用之前执行),行为未定义。

答案 2 :(得分:1)

实际上,正如目前为止几乎所有答案都已经说明的那样,指针的值是未知的,它包含分配时该位置的内存内容。

与某些答案所说的相反,没有人会禁止你解除引用它,或者用这个指针进行任何操作。

因此,使用这样的指针产生任何类型的不可预测的结果。这不仅是最佳实践,而且是要求用于生成较少错误的代码,初始化声明指向某事的指针,即使该东西是简单的NULL。

答案 3 :(得分:0)

它指向随机存储位置。取消引用这样的指针通常会导致段错误。

答案 4 :(得分:0)

在这种情况下,它将指向任何地方。你不知道。指针的内容将是之前在内存位置的内容。所以这非常危险,应该避免。你应该总是使用NULL初始化一个指针,然后它将以定义的方式指向“无”。

答案 5 :(得分:0)

与C中的任何其他非静态变量一样,它不会自动初始化。它包含内存插槽中的任何垃圾数据,因此在为其分配适当的值之前对其进行引用可能是一个坏主意。