2016-10-21 3 views
-1

, когда я пытаюсь использовать следующий код в visual studio, мне дают 45, но когда я запускаю его в онлайн-компиляторах, некоторые дают мне ошибку, а некоторые дают мне 0. Я ожидал, что все они дадут мне ошибку. как это они? благодарялокальные переменные в C

#include <stdio.h> 

int *f(int *a) 
{ 
    *a = 23; 
    int b = 45; 
    return &b; 
} 

int main(void) 
{ 
    int i = 2; 
    int *p; 
    p = f(&i); 

    printf("The return value of function f: %d\n\n", *p); 
    return 0; 
} 
+0

Вы возвращаете ссылку на выделенную стекю переменную - это ** очень * * Плохо!! Не делайте этого, это может вызвать массу неприятных скрытых ошибок. – UnholySheep

+1

Даже если вы получаете правильное значение в визуальной студии, это неправильно. Вы не получаете никакой ошибки, так как возвращаемый тип функции - int *, и вы возвращаете int *. – MayurK

+0

@MayurK Просто потому что re is * no * правильное значение .. –

ответ

1

Проблема:

return &b; 

Вы возвращаете указатель на локальную переменную, которая выходит за рамки - значит, указатель будет недействительна

Если вы получаете ошибка зависит от различных настроек этого компилятора

+0

Я думаю, именно поэтому она ожидала, что компиляторы дадут ошибку. Поэтому он не отвечает на вопрос. –

+0

Компилятор не дает ошибки, так как нет ошибки в этой конкретной строке, и это совершенно законно ... –

+0

@ EugeneSh.- Просто потому, что вы не попались, это не значит, что это законно. Вор по этому случаю повезло –

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

  • Нет связанных вопросов^_^