2014-01-02 5 views
1

Приведенный ниже фрагмент кода дает 11 11 неопределенное значение. Но почему я получаю неопределенное значение, когда тот же оператор выполняется второй раз? Это что-то связано с объемом функции?Указатели и аргументы функции

void foo(int **const p) 
     { 
      int j = 11; 
      *p = &j; 
      printf("%d ", **p); 
     } 

    int main() 
     { 
      int i = 10; 
      int *p = &i; 
      foo(&p); 
      printf("%d ", *p); 
      printf("%d ", *p); 
     return 0; 
     } 

ответ

5

Вы, указывающие на элемент, который был уже освобождаться как только foo функция возвращает. Это ошибка, затем происходит неопределенное поведение.

После того, как переменная выходит за пределы области видимости, она не перезаписывается автоматически, ее значение остается там, пока какая-либо другая инструкция не использует это место памяти для хранения другого значения. В примере выполнение первого printf перезаписывает местоположение памяти, на которое указывает p, поэтому, когда вы читаете его во второй раз, вы видите, что его значение изменилось.

Вы можете исправить это следующим образом:

void foo(int **const p) 
{ 
    int *j = (int *)malloc(sizeof(int)); 
    *p = j; 
    printf("%d ", **p); 
} 
int main() 
{ 
    int i = 10; 
    int *p = &i; 
    foo(&p); 
    printf("%d ", *p); 
    printf("%d ", *p); 
    free(p) 
    return 0; 
} 

Это не красиво, но для учебных целей это может быть хорошо.

6

Когда foo() выходов, *p указывает на переменную, которая больше не существует. Поэтому вы вызываете неопределенное поведение.

+0

Это то, что я до сих пор не могу понять, почему он работает в первый раз после выполнения функции и не работает при следующих попытках. Я ожидал бы, что он потерпит неудачу и для первого printf в главном – Dabo

+2

@DavidBo. Это точка - ** что-либо ** может случиться. Нет правил относительно того, как работает программа, когда вызывается неопределенное поведение. Это будет зависеть от вашей реализации. Главное правило - не вызывать UB вообще. – mathematician1975

+0

Получил, спасибо. – Dabo

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