用0初始化一个整数与不使用C初始化它

时间:2018-07-14 03:22:26

标签: c int

int variable;int variable = 0;有什么区别?我见过它们都使用过,并且,如果我没记错的话,是由同一作者在同一文件中使用的。

据我所知,它们是相同的:

$ cat integers.c
#include <stdio.h>

int main(void) {
    int patty;
    int tim = 0;
    printf("Patty: %d\nTim: %d\n", patty, tim);
}
$ gcc integers.c -o integers
$ ./integers
Patty: 0
Tim: 0

这也适用于其他变量类型:char *variable;char *variable = NULL;有什么区别?

3 个答案:

答案 0 :(得分:4)

  

据我所知,它们是相同的

不,他们不是。访问patty是未定义的行为,因为它没有初始化。您刚好得到相同的结果。如果patty是全局的,那么它将被默认初始化(0)。

答案 1 :(得分:3)

变量pattytim的存储期限都是自动的。

变量pattytim的存储期限是相同的,但是当您尝试访问它们时,结果可能会有所不同,因为其中一个已初始化而另一个未初始化,并且使用自动存储期限来访问未初始化的对象是undefined behavior

    int patty;   //Uninitialized
    int tim = 0; //Initialized

来自C标准#6.7.9p10 [初始化]

  

如果未自动初始化具有自动存储期限的对象,则其值不确定。

根据C标准#J.2 [未定义的行为]

  

具有不确定存储期限的对象的值在不确定时使用(6.2.4、6.7.9、6.8)。

未定义的行为包括它可能执行不正确(崩溃或无提示地生成不正确的结果),或者可能偶然地完全按照程序员的意图执行。

尽管您在输出中获得的pattytim变量的值相同,但是肯定不相同。

$ ./integers
Patty: 0    <----- indeterminate value
Tim: 0      <----- value that tim initialized with

答案 2 :(得分:1)

实际上它们并不相同,未分配的变量可能具有任何垃圾值,但分配的变量具有定义的值 例如 诠释 int j = 6; 如果打印这些,则h不会总是为0,但j变量肯定会为6