As variáveis locais são armazenadas em uma forma de memória chamada Memória da Pilha. Cada vez que uma função é chamada, as variáveis locais declaradas dentro da função são armazenadas na pilha em uma ordem específica. Quando a chamada de função termina, as variáveis locais são removidas da pilha na ordem oposta em que foram armazenadas, e o endereço de memória associado às variáveis locais não é mais válido. Isso indica que a variável local não pode mais ser acessada usando o ponteiro que foi usado anteriormente.
Razões do aviso
As razões que isso aviso pode ocorrer são:
1: fora do escopo
Se um ponteiro for usado para acessar uma variável local após o endereço da variável local desaparecer fora do escopo, o "Endereço da pilha associada à variável local retornada”Será jogado. Isso pode acontecer se o ponteiro usado para acessar a variável local não for gerenciado corretamente, ou se a função for saída antes que o ponteiro seja usado. Para corrigir esse problema, o ponteiro deve ser verificado primeiro para garantir que seja válido. Depois que o ponteiro é confirmado como válido, o ponteiro deve ser tratado corretamente. Se o ponteiro não for tratado corretamente, o aviso vai persistir.
Finalmente, é importante observar que o “Endereço da pilha associada à variável local retornada”Também pode ser causado por outros avisos, como um transbordamento de pilha, onde a pilha é preenchida com mais variáveis do que pode segurar. Se ocorrer um transbordamento de pilha, é importante corrigir o problema subjacente que fez com que a pilha transborde para garantir o “Endereço da pilha associada à variável local retornada”Não é jogado.
Veja este exemplo:
#incluir
char* getString ()
char S [100];
printf ("Digite uma string:");
scanf ("%s", s);
retorno s;
int main ()
char* s = getString ();
printf ("Você entrou: %s \ n", s);
retornar 0;
O getString () o método cria uma matriz local str na pilha neste exemplo e usa scanf () Para ler uma string do usuário.A função retorna um ponteiro para esta variável local STR. O ponteiro devolvido é atribuído a s no principal() método, e é impresso usando printf (). No entanto, desde então str é uma variável local na pilha e sua memória não é mais utilizável quando o getTring () Saídas do método, isso levará a um comportamento indefinível.
Saída
Podemos usar Malloc () ou um método semelhante para alocar dinamicamente a memória da string e retornar uma referência a esta memória recém -criada para evitar isso aviso e o comportamento indefinido que se seguiu. Aqui está uma ilustração de como alterar o código anterior para se livrar do aviso:
#incluir
#incluir
char* getString ()
char * s = malloc (100 * sizeof (char));
printf ("Digite uma string:");
scanf ("%s", s);
retorno s;
int main ()
char* s = getString ();
printf ("Você entrou: %s \ n", s);
livre (s);
retornar 0;
No código atualizado acima, alocamos dinamicamente 100 bytes de memória para a string usando Malloc () e retornar uma referência a esta memória. Uma vez que passarmos utilizando a memória, chamamos livre() para liberá -lo. Mudamos o aviso e garantimos que a RAM que estamos utilizando é válida durante a duração de nosso aplicativo, fazendo isso.
Saída
2: Declaração errada de variáveis locais
Além de garantir que o ponteiro seja tratado corretamente, também é importante garantir que o As variáveis locais são declaradas corretamente. Se as variáveis forem declaradas na ordem errada ou se as variáveis forem declaradas na hora errada, o aviso pode ocorrer. Por exemplo, se a variável local for declarada após o término da função, o endereço da variável local não será mais válido.
#incluir
int* add (int a, int b)
int sum = a + b;
retornar ∑
int main ()
int* endereço = add (5, 6);
O compilador está impedindo a função de retornar o endereço do soma desde soma foi definido e inicializado dentro do bloco de funções, tornando -o uma variável local (usando o Operador). Todas as variáveis locais são excluídas imediatamente à medida que a função sai, portanto a declaração de retorno não deve retornar um ponteiro que inclua a localização de uma variável local (soma). Caso contrário, seu ponteiro estará apontando para uma parte da memória que você não tem mais controle.
Saída
O endereço de retorno é de uma variável local, que é um problema.A correção é passar o endereço como um parâmetro para a função e alocar dinamicamente a memória para uma variável para segurá -lo. A variável não é mais uma variável local porque foi definida fora do bloco de funções.
Veja o código aqui:
#incluir
#incluir
int* add (int a, int b, int* soma)
*soma = a + b;
soma de retorno;
int main ()
int* sum = malloc (sizeof (int));
add (5, 6, soma);
printf ("A soma %d é armazenada no endereço %p \ n", *soma, (void *) soma);
grátis (soma);
retornar 0;
O código acima usa o Malloc () função para alocar memória para um número inteiro e o adicionar() A função recebe uma referência a essa memória como o parâmetro da soma. A função se multiplica a e b, salva o resultado na memória referida por soma e depois retorna a soma. Relatamos o valor e a localização do número inteiro referido por soma em principal(). Para impedir vazamentos de memória, então usamos livre() para liberar a memória que o Malloc alocou.
Saída
Conclusão
O "Endereço da pilha associada à variável local retornada”É um aviso que pode ocorrer quando um ponteiro para uma variável local é usado após o endereço da variável local sair do escopo. Para impedir que esse aviso ocorra, o gerenciamento adequado do ponteiro e as declarações de variáveis locais são importantes. Também é crucial confirmar que nenhum outro aviso está causando um transbordamento de pilha. Seguindo estas diretrizes, o “Endereço da pilha associada à variável local retornada" pode ser evitado.