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

C 一个新声明的指针,它指向哪里?,c,pointers,C,Pointers,我现在在学习C,这些天我在学习指针,我只是带着一个问题来的 int *ptr; //declare the ptr ptr = &var; //init the ptr with the address of the variable var 通过这些行,我创建了一个指针,并用一个变量链接了ptr。我的问题是,当我声明一个指针int*ptr我没有用地址初始化它,这个指针指向哪里 它与任何其他未初始化的局部变量一样——它指向的位置或包含的值未定义,在初始化之前不允许使

我现在在学习C,这些天我在学习指针,我只是带着一个问题来的

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

通过这些行,我创建了一个指针,并用一个变量链接了ptr。我的问题是,当我声明一个指针
int*ptr我没有用地址初始化它,这个指针指向哪里

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

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

它指向随机内存位置。取消对此类指针的引用通常会导致segfault。

它指向随机内存位置。取消引用这样的指针通常会导致segfault。

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

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

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

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

实际上,正如迄今为止在几乎所有答案中所述,指针的值是未知的,它由分配时该位置的内存内容组成

与一些答案所说的相反,没有任何东西会禁止你去引用它,或者用这个指针做任何类型的操作


因此,使用这样的指针将产生任何不可预测的结果。这不仅是最佳实践,而且是一个要求,用于生成更少的错误代码,在声明上初始化指向某个对象的指针,即使该对象是空的。

实际上,正如目前为止几乎所有答案中所述,指针的值是未知的,由分配指针时该位置的内存内容组成

与一些答案所说的相反,没有任何东西会禁止你去引用它,或者用这个指针做任何类型的操作


因此,使用这样的指针将产生任何不可预测的结果。初始化指向某个对象的声明指针,即使该对象简单地为NULL,这不仅是最佳实践,而且是一个要求,以产生更少的错误代码。

在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表示:

如果左值指定了自动存储持续时间的对象[…]和该对象 未初始化(未使用初始值设定项声明,且未对其进行赋值) 在使用前执行),行为未定义


在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
导致未定义行为的行为的技术术语是所谓的“左值转换”。这就是你的时刻