2016-03-29 2 views
-3

Посмотрите на следующий фрагмент кода:Auto переменная сохраняет значение по вызовы функций

void abc(void) 
{ 
    int a; 
    printf("%d\n", a); 
} 

void xyz(void) 
{ 
    int a = 44; 
} 

int main(void) 
{ 
    xyz(); 
    abc(); 
} 

Когда я скомпилировать и запустить программу, она показывает значение из 44. Я ожидал, что это отобразить другое значение мусора. Если я использую оптимизацию, результат будет таким, как ожидалось. Может ли кто-нибудь помочь мне разобраться в конкретной проблеме?

Благодаря

+1

Проблема в том, что вы используете неинициализированную переменную. –

ответ

0
void abc(void) 
{ 
    int a; 
    printf("%d\n", a); 
} 

Вы используете a неинициализированным, что неопределенное поведение. Это означает, что все может случиться, включая (но не гарантировано) память, выделенная для a в abc(), все еще удерживающая некоторое предыдущее значение (то есть значение, присвоенное в течение xyz()).

Другой поток мог бы исказить эту память. Его можно было обнулить, когда вы вернулись с xyz(). В системе может быть тип оперативной памяти, который «забывает» неиспользуемую память, заменяя предыдущее значение случайным шумом. Никогда не прикасайтесь к неопределенному поведению.

Это может быть немного менее запутанным, если вы переименуете одну из двух переменных в нечто иное, чем a. То, что у них одинаковое имя здесь не влияет; они являются первыми int, объявленными в соответствующей функции, которые - по вашей конкретной архитектуре - привели к тому, что они занимают один и тот же адрес памяти. Это совпадение, а не то, что гарантирует язык. I.e., это не определено.

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