2014-11-27 3 views
-1

Я делаю программу для обработки изображений и у меня есть эти переменные инициализируются:Невозможно инициализировать Int при 0 в с

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

И когда я печатаю это, вместо того, чтобы получить 0, как это должно быть , Я получаю 16384 как значение maxG. Тем не менее, если я это сделаю:

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

Тогда все будет хорошо.

Кто-нибудь знает, почему это может быть? Спасибо.

+2

Вы должны инициализировать каждую переменную отдельно – tnishada

ответ

5

Инициализатор применяется только к одному декларатору, который он следует, а не к другим деклараторам в списке!

So int a = 10, b, * c = NULL; только инициализирует a и c, но b остается неинициализированным.

(Кстати, чтение неинициализированный переменной имеет неопределенное поведение.)

+0

«Кстати, чтение неинициализированной переменной имеет неопределенное поведение». - Это верно в C89. Это не обязательно верно в C99: это зависит от того, имеет ли тип ловушечные представления, которых нет у большинства целочисленных типов в большинстве реализаций. Однако не уверен в C11. – hvd

+1

[(Почему) использует неинициализированную переменную неопределенного поведения в C?] (Http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c) – 2501

+0

@hvd: вам нужно прочитать несколько углов в стандарте, но это UB. –

4
int maxR, maxG, maxB = 0; 

Это становится:

int maxR; 
int maxG; 
int maxB = 0; 

MaxR Так и MaxG не инициализируются.

0

Вам необходимо инициализировать все переменные.

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

только maxB Здесь инициализируется 0.

Легче способа обнаружить это:
Compile с -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))); 
+0

Это неверно. Вторая строка - назначение. Как правило, всегда нужно отдавать предпочтение инициализации над назначением. –

+0

Но разве это неправильно? Разве это не вопрос выбора? Его инициализация 'maxB', с последующим назначением' maxR' и 'maxG'. –

+0

Неправильное использование терминологии. В этом отрывке нет инициализации. –

0

Заявление должно быть так:

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

maxG в выписке остается неинициализированным ..

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 к чему-то перед печатью! :)

Смежные вопросы