无法在c中的0处初始化int

时间:2014-11-27 11:17:49

标签: c initialization int

我正在制作一个图像处理程序,我已经初始化了这个变量:

int minR, minG, minB = 255; int maxR, maxG, maxB = 0;
  printf("%d", maxG);

当我打印出来时,我得到16384作为maxG的值而不是得到0。但是,如果我这样做:

int minR, minG, minB = 255; int maxR, maxB = 0;
  int maxG = 0; printf("%d", maxG);

然后一切顺利。

有谁知道为什么会这样?谢谢。

6 个答案:

答案 0 :(得分:5)

初始化程序仅适用于它所遵循的一个声明符,而不是列表中的任何其他声明符!

因此int a = 10, b, * c = NULL;仅初始化ac,但b仍然未初始化。

(顺便说一下,读取未初始化的变量有未定义的行为。)

答案 1 :(得分:4)

int maxR, maxG, maxB = 0;

这变为:

int maxR;
int maxG;
int maxB = 0;

因此MaxRMaxG未初始化。

答案 2 :(得分:3)

int maxR, maxG, maxB = 0;   

此处只有maxB被初始化为0

更容易检测到这种情况:
使用-Wall-Wextra进行编译。

int minR, minG, minB = 255; int maxR, maxG, maxB = 0;
printf("%d", maxG); 

$ gcc -o exe -Wextra
warning: ‘maxG’ is used uninitialized in this function [-Wuninitialized]

更容易实现此目的:

int maxR, maxG, maxB;
maxR = maxG = maxB = 0;

第一行是声明。
以下行是赋值,从左到右进行评估。

(maxR = (maxG = (maxB = 0)));

答案 3 :(得分:1)

int minR, minG, minB = 255; int maxR, maxG, maxB = 0;
  printf("%d", maxG);

就像

int minR;
int minG;
int minB = 255;
int maxR;
int maxG;
int maxB = 0;
printf("%d", maxG);

但是maxG没有初始化,所以它指向你记忆中的某个地方。当您尝试打印时,16384是实际值maxG,但它可以是任何东西!

想象我的记忆就像这样XXXXXXXX919A9F7B62A526XXXXXX

想象一下当你做到了

int maG;

为此分配的内存指向

XXXXXXXX919A9F7B62A526XXXXXX
          ^

因为我假设你的系统告诉sizeof(int)是4 * 8位,printf会打印

XXXXXXXX919A9F7B62A526XXXXXX
          ^^^^^^^^
          1o2o3o4o

9A9F7B62(十六进制)= 2594143074(十进制)

所以你需要在打印之前将maxG初始化为某个东西! :)

答案 4 :(得分:0)

您需要初始化所有变量。

int minR = 255, minG = 255, minB = 255; int maxR = 0, maxG = 0, maxB = 0;

答案 5 :(得分:0)

声明应该是这样的:

int minR = 255, minG = 255, minB = 255; int maxR = 0, maxG = 0, maxB = 0;
你声明中的

maxG仍然没有初始化..