Todos sus ejemplos producen un comportamiento de tiempo de ejecución indefinido. Está devolviendo punteros o referencias a elementos que desaparecen después de que la ejecución abandona la función.
Aclaro:
int * returnA()
{
static int a; // The static keyword keeps the variable from disappearing.
int * j = 0; // Declare a pointer to an int and initialize to location 0.
j = &a; // j now points to a.
return j; // return the location of the static variable (evil).
}
En su función, la variable j
se asigna a apuntar a a
's ubicación temporal. Al salir de su función, la variable a
desaparece, pero su ubicación anterior se devuelve a través del j
. Como a
ya no existe en la ubicación señalada por j
, se producirá un comportamiento indefinido al acceder al *j
.
Las variables dentro de las funciones no se deben modificar mediante referencia o puntero por otro código. Puede suceder aunque produce un comportamiento indefinido.
Siendo pedantes, los punteros devueltos deben declararse como apuntando a datos constantes. Las referencias devueltas deben ser const:
const char * Hello()
{
static const char text[] = "Hello";
return text;
}
La función anterior devuelve un puntero a datos constantes. Otro código puede acceder (leer) los datos estáticos pero no puede modificarse.
const unsigned int& Counter()
{
static unsigned int value = 0;
value = value + 1;
return value;
}
En la función anterior, el value
se inicializa a cero en la primera entrada. Todas las siguientes ejecuciones de esta función provocan que value
se incremente en uno. La función devuelve una referencia a un valor constante. Esto significa que otras funciones pueden usar el valor (desde lejos) como si fuera una variable (sin tener que desviar un puntero).
En mi opinión, un puntero se utiliza para un parámetro u objeto opcional. Se pasa una referencia cuando el objeto debe existir. Dentro de la función, un parámetro referenciado significa que el valor existe, sin embargo, se debe verificar que un puntero sea nulo antes de desreferenciarlo. Además, con una referencia, hay más garantía de que el objeto de destino es válido. Un puntero podría apuntar a una dirección no válida (no nula) y causar un comportamiento indefinido.
Las respuestas a estas preguntas dependen enteramente en las declaraciones de a, b y c, que parecen estar ausentes del código. –
Supongamos que a, b, c están inicializados. –
Las variables son ints. –