2015-11-11 3 views
-1

Я написал эту программу C с последующим выходомОбъясните следующий вывод для программы C

#include<stdio.h> 
#include<string.h> 
int counter; // global for counting input tokens 
char * CreateTemp() 
{ 
int counter; // for counting temporaries 
char s[10]; 
sprintf(s,"T%d",counter++); 
return(strdup(s)); 
} 
main() 
{ 
char *s1; 
char *s2; 
char *s3; 
s1=CreateTemp(); 
s2=CreateTemp(); 
printf("Temp is %s\n",s1); 
printf("Temp is %s\n",s2); 
s3=CreateTemp(); 
printf("Temp is %s\n",s3); 
} 

Выход:

Temp is T0 //Temp is T0 
Temp is T1 //Temp is T1 
Temp is T32600 //Temp is T2 

Я не знаю, почему я получил такой вывод для T2? Какова причина?

Когда я удалил:

int counter; // для подсчета временных

... Я получил:

Temp is T0 
Temp is T1 
Temp is T2 

Почему, когда я удалил конкретную строку:

Int counter;/for counting temporaries 

ли я получить правильный результат, но когда я держал его Я получил путаные результаты для T2?

Кроме того, почему, когда я добавить static к:

int counter; // for counting temporaries 

Чтобы стать:

static int counter; // for counting temporaries 

И удалить:

int counter; // global for counting input tokens 

сделал я также получил правильный результат?

+2

Перед тем, как присвоить ему какое-либо значение, вы читаете локальную переменную ('counter', как указано в' CreateTemp'). Это приводит к неопределенному поведению. Возможно, что-нибудь (включая сбой программы при каждом вызове 'CreateTemp'). –

ответ

5
int counter; // for counting temporaries 
char s[10]; 
sprintf(s,"T%d",counter++); 
  • Вы должны инициализировать переменные в C. Othewise их значение не определено; часто что-то случайное.
  • Если вы хотите, чтобы локальная переменная, чтобы сохранить то же самое между вызовами функции, вы можете сделать это static:

    static int counter = 0; 
    

Это тоже плохая идея, чтобы иметь как локальные и глобальные переменные с одно и то же имя. Когда вы удаляете свою строку, вы получаете глобальную переменную. Вот почему это работает.

6

Локальные переменные не инициализируются по умолчанию и использовать их без присвоения им явного Урожайность значения, неопределенного поведения, что означает ничего может произойти.

Стандарт C буквально не определяет, что происходит, так что это (случайное) совпадение, первые две строки правильные, а последние нет. С точки зрения стандарта C неопределенное поведение может даже привести к взрыву вашей машины.

Глобальные переменные по умолчанию инициализируются нулем.

5

Счетчик int внутри CreateTemp «скрывает» определение глобального счетчика, так что всегда 0, и поскольку счетчик внутри CreateTemp не инициализирован, вы получаете какие-либо данные, находящиеся там.

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