Considerando que parâmetros e variáveis locais de função e procedimento são desalocados da memória após sua execução, observe a seguinte função implementada na linguagem C:
int *fazAlgo() {
int val = 23, *pt;
pt = &val;
return pt;
}
De acordo com o programa dado, analise as seguintes asserções.
A função fazAlgo está logicamente correta na devolução do endereço armazenado em pt.
PORQUE
Ao término da função fazAlgo, a variável val é desalocada, mas será devolvido o endereço de memória reservado para a variável val, sem problemas de execução.
Sobre as asserções a respeito da função em C dada, marque a alternativa correta.
a) As duas são proposições verdadeiras, e a segunda é uma justificativa correta da primeira.
b) Tanto a primeira quanto a segunda são asserções falsas.
c) A primeira é uma proposição falsa, e a segunda verdadeira.
d) As duas são proposições verdadeiras, e a segunda não é uma justificativa correta da primeira.
e) A primeira é uma proposição verdadeira, e a segunda falsa.
Eu fiz esse código para teste:
#include <stdio.h>
int *fazAlgo(void);
int main(void) {
int *x;
x = fazAlgo();
printf("X = %d\n", *x);
*x = 10;
printf("X = %d\n", *x);
return 0;
}
int *fazAlgo(void)
{
int val = 23, *pt;
pt = &val;
return pt;
}
Funciona sem qualquer erro ou aviso.
A resposta dessa questão de acordo com o gabarito é letra b, mas por quê ?
Eu acho que alocando dessa forma e retornando o endereço pode ocorrer do sistema operacional liberar esse endereço para outro programa ou variável, visto que ele "pensa" que o endereço está vago, é isso ?