Endereço de retorno da variável local em C

Digamos que eu tenha as seguintes duas funções:

1

int * foo() { int b=8; int * temp=&b; return temp; } 

2

 int * foo() { int b=8; return &b; } 

Eu não recebo nenhum aviso para o primeiro (por exemplo, a function retorna o endereço de uma variável local ), mas sei que isso é ilegal, já que b desaparece da pilha e ficamos com um ponteiro para a memory indefinida.

Então, quando preciso ter cuidado ao retornar o endereço de um valor temporário?

    O motivo pelo qual você não está recebendo um aviso no primeiro trecho é porque você não está (da perspectiva do compilador) retornando um endereço para uma variável local.

    Você está retornando o valor de int * temp . Mesmo que essa variável possa ser (e neste exemplo é) contendo um valor que é um endereço de uma variável local, o compilador não subirá a pilha de execução de código para ver se esse é o caso.

    Nota : Ambos os trechos são igualmente ruins, mesmo que seu compilador não o avise sobre o primeiro. Não use essa abordagem.


    Você deve sempre ter cuidado ao retornar endereços a variables ​​locais; como regra, você poderia dizer que nunca deveria.

    variables static são um caso totalmente diferente, o que está sendo discutido neste tópico .

    Eu diria que você pode retornar a variável local ou os pointers para tal IF foi dinamicamente alocado por malloc, nesse caso, a memory usada para armazenar variável quer estar na pilha, mas na pilha e não será apagada ou reutilizada após saindo da function como ocorre no caso de variables ​​locais automáticas (criadas sem malloc), estou certo?

    Ambos os exemplos estão igualmente incorretos. Meu palpite é que o seu compilador não vê o perigo e, portanto, não emite um aviso quando você armazena o endereço em uma variável temporária.

    Esta questão é provavelmente uma das mais discutidas no StackO. Abaixo, duas respostas de threads similares no StackO que eu achei interessantes, e provavelmente me fizeram deixar essa prática ruim de des-referenciação de variables ​​locais, apesar das chances de eu errar o comportamento errado (comportamento indefinido).

    Aqui está uma resposta simples

    Eu gostei especialmente da resposta.

    Aqui está um exemplo em que essa prática ruim causou alguns danos reais ao hardware

    Ambos são ruins, e um bom compilador deve ser capaz de detectar e avisar sobre ambas as situações. Você pode obter melhores resultados, transformando o nível de aviso em máximo (o que você sempre deve fazer de qualquer maneira) e ativar a otimização.