La función devuelve la dirección de un error de variable local en C++

Shikha Chaudhary 11 diciembre 2023
  1. La función devuelve la dirección de un error de variable local en C++
  2. Causa de la función devuelve la dirección de una variable local en C++
  3. Ejemplos en los que la función devuelve la dirección de una variable local Se produce un error en C++
  4. Conclusión
La función devuelve la dirección de un error de variable local en C++

Según el alcance, las variables en C y C++ se dividen en variables locales y globales. Si bien se puede acceder a las variables globales desde cualquier parte del programa, no ocurre lo mismo con las variables locales.

Por lo tanto, es importante usarlos con cuidado cuando varias funciones están involucradas en el código. De lo contrario, es posible que encuentre el error dirección de la variable local devuelta.

Discutamos por qué ocurre este error y cómo solucionarlo.

La función devuelve la dirección de un error de variable local en C++

Para comprender las razones y las posibles soluciones del error la función devuelve la dirección de la variable local, debemos saber cómo funciona una variable local. Hablemos de esto primero.

El Comportamiento de una Variable Local en C++

Una variable local es una variable que se define dentro de una función y no se puede usar fuera de esa función en particular. En otras palabras, existe solo dentro de la función donde se definió y no se puede acceder desde ninguna otra parte del programa.

Y aquí hay una información muy importante: la vida de una variable local se destruye tan pronto como la función finaliza su ejecución.

Mira este ejemplo. Aquí, la variable costo se declara dentro de la función demo(); por lo tanto, su alcance se limita a esta función únicamente.

Dentro del bloque principal, intentamos acceder a esta variable local y, por lo tanto, el programa se ejecuta en un error.

Básicamente, así es como funciona una variable local.

#include <iostream>
using namespace std;

void demo() {
  int cost = 5000;
  cout << "The variable cost is local to the demo function." << endl;
}
int main() {
  int cakes = 10;
  demo();
  cout << "Payable amount: " << cost;
}

Producción :

In function 'int main()':
error: 'cost' was not declared in this scope
     13 |     cout << "Payable amount: " << cost;
        |                                   ^~~~

Ahora ya sabe que usar una variable local fuera de su alcance es ilegal. Discutamos por qué ocurre el error la función devuelve la dirección de la variable local.

Para saber más sobre variables locales y funciones en C++, consulte esta documentación.

Causa de la función devuelve la dirección de una variable local en C++

El error función devuelve la dirección de la variable local suele ocurrir al trabajar con funciones y variables locales. De la misma forma que no podemos acceder a una variable local fuera de su ámbito definido, tampoco podemos acceder a su dirección fuera de ese ámbito.

Míralo así. Cuando intenta acceder a una variable local fuera del alcance definido, obtiene el error variable no declarada en este alcance, como se ve en el ejemplo anterior.

Sin embargo, si intenta acceder a la dirección de una variable local fuera del alcance definido, obtiene el error la función devuelve la dirección de la variable local.

He aquí por qué sucede esto.

Sabemos que una variable local se destruye una vez que la función completa su ejecución. Esto significa que el puntero que devuelve la dirección de la variable local ahora apunta a un objeto que ni siquiera existe.

Los punteros a las variables locales no pueden salir de la función donde vive la variable local. Pero cuando esto sucede, podemos decir que el puntero cambia a un puntero colgante y, por lo tanto, obtenemos el error la función devuelve la dirección de la variable local.

Este error puede ocurrir en varios casos. Discutámoslos uno por uno.

Ejemplos en los que la función devuelve la dirección de una variable local Se produce un error en C++

Si bien la causa de todos esos códigos que se ejecutan en el error la función devuelve la dirección de la variable local es la misma que se discutió anteriormente, veamos algunos ejemplos en detalle.

Función devuelve un puntero a una variable local

Mira el código que se muestra a continuación. Tenemos una función llamada demo(), que toma dos valores enteros y los suma.

La función almacena la suma en la variable costo y luego devuelve la dirección de esta variable. Pero cuando ejecuta este código, obtiene el error dirección de la variable local devuelta.

Tenga en cuenta dos cosas aquí.

  1. La variable coste se define dentro de la función demo(); por lo tanto, su alcance se limita únicamente a esta función. Es una variable local.
  2. La instrucción return devuelve un puntero que tiene la dirección de la variable local, cost.

Sabemos que tan pronto como la función demo() finaliza su ejecución, la variable local cost presente en su interior también se destruye. Esto significa que el puntero que antes apuntaba a la dirección de la variable costo ahora comienza a apuntar a un lugar en la memoria que ya no poseemos.

Por lo tanto, obtenemos este error.

#include <iostream>
using namespace std;

int* demo(int cherry, int pie) {
  int cost = cherry + pie;
  return &cost;
}

int main() { int* ans = demo(100, 20); }

Producción :

In function 'int* demo(int, int)':
warning: address of local variable 'cost' returned [-Werturn-local-addr]
    7 |    return &cost;
      |           ^~~~~
note: declared here
    6 |    int cost = cherry + pie;
      |        ^~~~

Veamos cómo solucionar esto. El problema es que la dirección de retorno es la de una variable local; por lo tanto, la asignación de memoria dinámica ayudará a resolver esto.

Dentro del bloque principal, definimos dinámicamente la variable costo y asignamos memoria. Luego, pasamos esta variable como parámetro a la función demo().

#include <iostream>
using namespace std;

int* demo(int cherry, int pie, int* cost) {
  *cost = cherry + pie;
  return cost;
}

int main() {
  int* cost = new int;
  cost = demo(100, 20, cost);

  cout << "The total is stored at address: " << cost;
}

Producción :

The total is stored at address: 0x55c7997a7eb0

Cuando ejecutamos este código, esta vez obtenemos el resultado correcto. Esto se debe a que la variable cost ya no es una variable local ya que se declara fuera de la función demo().

La función devuelve una cadena cuyo alcance es local

Mire el siguiente fragmento de código. Aquí, tomamos un nombre como entrada del usuario y verificamos si es válido usando la función checkname().

Dentro de la función checkname(), definimos una cadena llamada fullname y la devolvemos si pasa la condición de verificación. Pero el código se encuentra con el error la función devuelve la dirección de la variable local.

He aquí por qué sucede esto.

Tenemos una cadena llamada fullname cuyo alcance se limita a la función checkname(). Además, una cadena es como una matriz que se reduce a un puntero antes de que pueda pasarse.

Cuando volvamos al bloque principal, las variables locales de la función serán destruidas porque el control se ha movido fuera de esa función.

Es por eso que obtenemos el error.

#include <cstring>
#include <iostream>
using namespace std;

char* checkname() {
  char fullname[20];
  //....
  //......
  //....
  if ((strlen(fullname)) >= 4 && (strlen(fullname)) < 30) {
    return fullname;
  } else {
    return NULL;
  }
}

int main(void) {
  char name[20];
  cout << "Enter name:" << endl;
  name = checkname();
}

Producción :

warning: address of local variable 'fullname' returned [-Wreturn-local-addr]

Para solucionar esto, en lugar de devolver los datos, pásalos a la función de esta manera:

#include <cstring>
#include <iostream>
using namespace std;

void checkname(char *fullname) {
  if ((strlen(fullname)) >= 4 && (strlen(fullname)) < 30) {
    cout << "Success";
  } else {
    cout << "In else block";
  }
}

int main(void) {
  char name[20];
  cout << "Enter name:" << endl;
  checkname(name);
}

Producción :

Enter name:
In else block

Mira, el código funciona bien esta vez, y dado que no hemos tomado ninguna entrada, vamos dentro del bloque else.

Si bien esto resuelve el problema, una solución más robusta sería asignar dinámicamente la memoria a la variable fullname de esta manera:

char *fullname = malloc(sizeof(char) * the_size);
.......return fullname;

Cuando asignamos memoria dinámicamente, se asigna desde el montón cuyo tiempo de vida es válido hasta la ejecución del programa completo. Por lo tanto, cuando devolvemos la variable fullname ahora, obtenemos la dirección definida por malloc, y el código funciona bien.

Además, liberar la memoria una vez hecho es una buena práctica para evitar pérdidas de memoria.

Conclusión

Este artículo discutió el error la función devuelve la dirección de una variable local en C++. Aprendimos cómo se comportan las variables locales y cómo intentar acceder a ellas fuera de su alcance es ilegal.

Vimos las razones de este error y las posibles soluciones con la ayuda de algunos casos de uso.

Artículo relacionado - C++ Error