2012-06-04 4 views
2

Прежде всего, я прошу прощения за плохой английский.Почему это вызывает ошибку времени выполнения, символ int без инициализации?

На следующей простой программе,

void fx(int *a){ 
    for(int i=*a; i<='Z'; i++) 
    printf("%c", i); 
} 
int main(){ 
    int a; 
    scanf("%c", &a); 
    fx(&a); 
    return 0; 
} 

Я вошел в заглавную букву во время выполнения, это вызвало фатальную ошибку и была решена путем убийства proccess.

Это не вызывает проблем при следующих кодах.

//except fx() 
int main(){ 
    int a; 
    scanf("%c", &a); 
    return 0; 
} 

или

//initialize int a 
void fx(int *a){ 
    for(int i=*a; i<='Z'; i++) 
    printf("%c", i); 
} 
int main(){ 
    **int a = 0;** 
    scanf("%c", &a); 
    fx(&a); 
    return 0; 
} 

Я знаю, что это должно быть 'символ' для ввода символа. но я не могу понять ситуацию выше.

Что случилось?

PS. Я работал с VS2010, C++

+1

Просто интересно, почему вы используете 'int' для ввода символа. Почему не 'char'? Черт, если он помечен C++, почему бы не «cin»? – chris

+0

>> Chris Я просто что-то тестировал. И я отметил, потому что использовал cpp. –

ответ

2

Вы объявили неинициализированный INT в, и установить его нижние самые байты к чему-то. Результат может быть очень большим, потому что верхние байты (будь то 16-битные или 32-битные целые числа) остались неназначенными/неинициализированными.

Когда вы передали его функции, этот будет использовать всю длину int a. Затем вы устанавливаете цикл с условием «до тех пор, пока он не достигнет« Z », который, кстати, будет правильно продвинут на целое число (то есть все верхние неиспользуемые байты как 0).

В этом цикле вы будете заставляя бедную Printf попытаться вывести байты, охватывающие от 0 до 0xff, несколько Gazillion раза, в зависимости от того, как долго она может принять я к опрокидыванию в «Z». .. По-видимому, где-то в этом коде printf кому-то не нравились непечатаемые (не просто не-ascii) коды.

+0

Благодарим за ответ. Я думаю, что это более понятно для меня. Проблема была ** для цикла ** из 'фиктивного int a' в 'Z'. –

8

Разница между этим

int a; 
scanf("%c", &a); 

и это

int a = 0; 
scanf("%c", &a); 

что int a; объявляет неинициализированный a. Так может быть и все. Когда вы пишете

scanf("%c", &a); 

на неинициализированном int, вы устанавливаете только верхние биты, потому что %c говорит scanf писать вход в char, поэтому только первый байты будут записаны. Это может привести к некоторому странному поведению, включая то, что вы только что заявили.

+1

Чтобы добавить это, причина этого заключается в том, что 'scanf' не знает, насколько велика переменная, которую вы передаете, (потому что вы передаете указатель на адрес памяти, а не' int' или 'char 'или что угодно.) – OmnipotentEntity

+2

Не забывайте о проблемах с допуском: первые 8 бит 'a' могут не представлять наименее значимые ... –

+0

Благодарим вас за asnwer. Теперь я понимаю, что «scanf («% c »)» в «int» записывает только один укус. –

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