int main()
{
int **p = (int **) new int(7);
cout << *p;
}
Así, new int(7)
asigna sizeof(int)
bytes de memoria y devuelve un puntero a ella. Digamos que la memoria pasa a estar en la dirección X. Luego, X se convierte en (int**)
y se almacena en p
.
*p
elimina referencia a la int**
, lo que significa que intreprets el valor 7 int
en la dirección X
como un int*
.
Si sizeof(int*)
es mayor que sizeof(int)
, entonces la lectura como una int*
leerán más allá del búfer asignado con new
- comportamiento indefinido siempre independientemente de los tipos de datos y cualquier reintrepretation.
Si se trata del mismo tamaño, la CPU intenta leer la memoria que contiene el entero 7 como un int*
- esto normalmente dará el valor int*(7)
, pero mirando a la Norma 5.2.10.5:
Un valor de tipo integral o tipo de enumeración se puede convertir explícitamente en un puntero. * [Nota: la conversión de una expresión constante integral (expr.const) con valor cero siempre produce un puntero nulo (conv.ptr), pero la conversión de otras expresiones que tengan valor cero no necesita dar un puntero nulo. --- end foonote] Un puntero convertido a un entero de tamaño suficiente (si existe alguno en la implementación) y de regreso al mismo tipo de puntero tendrá su valor original; las asignaciones entre los punteros y los enteros son, de lo contrario, definidas por la implementación.
Por lo tanto, se garantiza que el valor entero se convertirá en algún valor de puntero, nada indefinido, pero el valor está definido por la implementación. Aún así, al tratarse de una operación reversible, es que probablemente sea que el int
7 arrojará int*
con el valor 7, lo que explica el comportamiento observado al generar "7".
- Si el tamaño del puntero es inferior al del
int
, se leerá una porción del valor int
e interpretar eso como un puntero. Dependiendo de la endianidad, ese segmento puede ser 0 o 7 o incluso algo más, pero de nuevo como int
debe ser convertible a algún valor de puntero que se mostrará.
¿Qué estás tratando de hacer? Una regla básica es que si tienes que lanzar, lo estás haciendo mal. Como 'new int (7)' devuelve 'int *', necesitabas lanzar. Pero el casting no hace que el código sea correcto. Solo documentos del hecho de que te equivocaste. Retire el yeso y trabaje desde allí. –
@David: el código es quizás de entrevista, no de OP. – Vlad
@ David Heffernan: Esta es una pregunta de entrevista en un examen escrito. Hubo cuatro opciones de error de tiempo de compilación, error de tiempo de ejecución, código se ejecutará bien y ninguno de los anteriores. Incluso yo no entiendo qué tipo de conocimiento están tratando de medir por tales preguntas de entrevista. – CppLearner