O uso de uma string C fornece um aviso Endereço da memória da pilha associada à variável local retornada - Fix

O uso de uma string C fornece um aviso Endereço da memória da pilha associada à variável local retornada - Fix
Um dos mais comuns avisos Isso pode ocorrer ao usar uma linguagem de programação C é o “Endereço da pilha associada à variável local retornada”. Esse aviso pode ocorrer quando a memória associada a uma variável local é acessada depois de sair do escopo. Em outras palavras, a referência da variável local não é mais estável. Para entender melhor isso aviso, É importante entender o conceito de memória da pilha e como ela se relaciona com variáveis ​​locais.

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.