我现在正在学习C,这些天我正在学习指针,我只是提出一个问题!
int *ptr; //declare the ptr
ptr = &var; //init the ptr with the address of the variable var
使用这些行,我创建了一个指针,并将ptr与变量相关联。我的问题是,当我声明一个指针int *ptr;
并且我没有用地址初始化它时,这个指针指向它?
答案 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中的任何其他非静态变量一样,它不会自动初始化。它包含内存插槽中的任何垃圾数据,因此在为其分配适当的值之前对其进行引用可能是一个坏主意。