我正在制作一个图像处理程序,我已经初始化了这个变量:
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);
然后一切顺利。
有谁知道为什么会这样?谢谢。
答案 0 :(得分:5)
初始化程序仅适用于它所遵循的一个声明符,而不是列表中的任何其他声明符!
因此int a = 10, b, * c = NULL;
仅初始化a
和c
,但b
仍然未初始化。
(顺便说一下,读取未初始化的变量有未定义的行为。)
答案 1 :(得分:4)
int maxR, maxG, maxB = 0;
这变为:
int maxR;
int maxG;
int maxB = 0;
因此MaxR
和MaxG
未初始化。
答案 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
仍然没有初始化..