2015-02-09 2 views
0

Как работает этот код, если после возврата элемента управления к переменной main() i удаляется из стека, как значение все равно может быть 5, поскольку i не существует в main() и переменной, на которую указывает указатель не существует.Как работает указатель?

#include<stdio.h> 

int* sum() { 
    int i=5; 
    int*a=&i; 
    printf("%d\n",a); 
    return a; 
} 

int main() { 
    int* a=sum(); 
    printf("%d\n",a); 
    printf("%d",*a); 
} 

выход:

2293252 
2293252 
5 
+0

Возможный дубликат [возврат локальной переменной из функции в C] (http://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c) – juanchopanza

+0

Возможный дубликат [ Можно ли получить доступ к локальной папке за пределами ее возможностей?] (Http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – Deduplicator

ответ

6

То, что вы видите неопределенное поведение.

Возврат адреса локальной переменной из функции приводит к неопределенному поведению.

Таким образом, результат может быть не таким, как ожидалось, на всех платформах.

int i=5; 

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

int* sum() 
{ 
    int*a = malloc(sizeof(int)); 
    *a = 5; 
    printf("%d\n",*a); 
    return a; 
} 

PS: printf("%p",(void*)a); должен быть использован для печати указателей, используя неправильный формат спецификатор привести к непредсказуемому поведению.

0

После того, как переменная удалена из стека, она не очищается, но ее просто можно использовать другими переменными вашей программы или освободить и вернуть в ОС, поэтому, если вы и ваша ОС не используете это пространство, оно содержит ваше предыдущее значение. если на бесплатной странице OS содержится этот адрес, связанный с этим адресом, вызывают ошибку сегментации. Если вы используете кучу, время усложняется.

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

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