Возникает ли такая функция в свисающем указателе?Это приводит к зависанию указателя?
int *foo() {
int a[2] = {2, 3};
int *p = NULL;
p = a;
return p;
}
Возникает ли такая функция в свисающем указателе?Это приводит к зависанию указателя?
int *foo() {
int a[2] = {2, 3};
int *p = NULL;
p = a;
return p;
}
Да. Вы возвращаете указатель на массив с автоматической продолжительностью хранения. Когда функция возвращает указатель, это неверно.
Никогда не возвращайте указатель на автоматический локальная переменная.
В вашем случае переменная a
не существует, как только foo
возвращает, поэтому указатель на нее будет недействительным (вызывает неопределенное поведение).
Технически возвращаемый указатель (p) указывает на некоторую ячейку памяти, которая _probably_ все еще используется как стек. Однако нет гарантии, что к тому моменту, когда вы перейдете к возвращенному указателю, что-то еще не перезаписало это место памяти. Даже если вы не получите ошибку segfault или другую недопустимую ошибку указателя, вы не можете рассчитывать на это, указывая на что-нибудь полезное. –
Да, поскольку при выходе 'foo' память, содержащая' a' (в стеке), де-распределяется в силу управления стеком в последовательности вызова C. – lurker