2013-10-05 5 views
0

Возникает ли такая функция в свисающем указателе?Это приводит к зависанию указателя?

int *foo() { 
    int a[2] = {2, 3}; 
    int *p = NULL; 
    p = a; 
    return p; 
} 
+0

Да, поскольку при выходе 'foo' память, содержащая' a' (в стеке), де-распределяется в силу управления стеком в последовательности вызова C. – lurker

ответ

6

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

2

Никогда не возвращайте указатель на автоматический локальная переменная.
В вашем случае переменная a не существует, как только foo возвращает, поэтому указатель на нее будет недействительным (вызывает неопределенное поведение).

+1

Технически возвращаемый указатель (p) указывает на некоторую ячейку памяти, которая _probably_ все еще используется как стек. Однако нет гарантии, что к тому моменту, когда вы перейдете к возвращенному указателю, что-то еще не перезаписало это место памяти. Даже если вы не получите ошибку segfault или другую недопустимую ошибку указателя, вы не можете рассчитывать на это, указывая на что-нибудь полезное. –

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