retornando uma variável local da function em C

#include  int foo1(void) { int p; p = 99; return p; } char *foo2(void) { char buffer[] = "test_123"; return buffer; } int *foo3(void) { int t[3] = {1,2,3}; return t; } int main(void) { int *p; char *s; printf("foo1: %d\n", foo1()); printf("foo2: %s\n", foo2()); printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]); return 0; } 

Quando eu compilo isto com gcc -ansi -pedantic -W -Wall o compilador emite mensagens de aviso para foo2 () e foo3 ():

 warning: function returns address of local variable 

Eu pensei que não é permitido retornar uma variável local, mas foo1 () funciona bem e parece que há uma enorme diferença entre o ponteiro de retorno para um object local e o próprio object.

Alguém poderia lançar alguma luz sobre esta questão? Desde já, obrigado!

    O problema aqui é que, quando você cria a variável local, ela é alocada na pilha e, portanto, fica indisponível quando a function termina a execução (a implementação varia aqui). A maneira preferível seria usar malloc() para reservar memory não-local. o perigo aqui é que você tem que desalocar ( free() ) tudo que você alocou usando malloc() , e se você esquecer, você cria um memory leaks.

    Para foo1() , você retorna uma cópia da variável local, não a própria variável local.

    Para as outras funções, você retorna uma cópia de um ponteiro para uma variável local. No entanto, essa variável local é desalocada quando a function termina, então você acaba com problemas desagradáveis ​​se tentar referenciá-la posteriormente.

    Qualquer variável tem algum espaço na memory. Um ponteiro faz referência a esse espaço. O espaço ocupado pelas variables ​​locais é desalocado quando a chamada da function retorna, o que significa que ela pode e será reutilizada para outras coisas. Como conseqüência, as referências a esse espaço vão acabar apontando para algo completamente não relacionado. Arrays em C são implementados como pointers, então isso acaba se aplicando a eles. E os arrays constantes declarados em uma function também contam como sendo locais.

    Se você quiser usar um array ou outro ponteiro além do escopo da function na qual ele é criado, você precisa usar o malloc para reservar o espaço para ele. O espaço reservado usando malloc não será realocado ou reutilizado até que seja explicitamente liberado chamando free.

    Sim, você está retornando uma matriz, que na verdade é um ponteiro nos bastidores, para o endereço do local da memory onde o conteúdo da variável que você inicializou está armazenado. Por isso, está avisando que talvez não seja tão útil retornar esse resultado, quando você pode realmente significar um dos valores da matriz.