2011-06-22 17 views
9

Cuando compilo y ejecuto este código C++, no obtengo el resultado que esperaba.C++ Imprimir el valor del puntero da un resultado extraño

#include <iostream> 
using namespace std; 

int main() 
{ 
    int * i = new int; 
    long * l = new long; 
    char * c = new char[100]; 
    float * f = new float[100]; 

    cout << "i " << i << endl; 
    cout << "l " << l << endl; 
    cout << "c " << c << endl; 
    cout << "f " << f << endl; 


    delete i; 
    delete l; 
    delete []c; 
    delete []f; 

    cin.get(); 
    return 0; 
} 

en una máquina UNIX me sale

i 0x967f008 
l 0x967f018 
c 
f 0x967f090 

en una máquina Windows el valor para copias de c como a través de una línea de caracteres aleatorios.

Por favor alguien puede explicar por qué no está imprimiendo correctamente el puntero de la matriz de caracteres.

Gracias

Respuesta

19

operator << para std::ostream y std::wostream se define de manera especial para los punteros char (char*, const char*, wchar_t* y const wchar_t* para imprimir una cadena terminada en cero. Esto le permite escribir

const char* str = "Hello, World"; 
std::cout << str; 

y ver un buen cuerda de la salida estándar.

para obtener el valor del puntero, modelado a void *

std::cout << static_cast<void*>(c) 
4

El operator<< está sobrecargado para char*. Considerará que está intentando imprimir una cadena de estilo C e imprimirá todos los caracteres hasta que encuentre un 0x00. Como no está inicializando la memoria asignada, imprimirá la basura al azar.

+0

cuál es la forma de hacer C++: '(* void) c'? –

+1

que sería 'reinterpret_cast (c)'. – Mat

+2

@hexa: aunque @Mat tiene razón en que '(void *) c' es equivalente a' reinterpret_cast (c) ', la * forma C++ * de hacerlo es' static_cast (c) '; –

0

Dado que no hay inicialización en el carácter señalado por c, se vuelcan algunos valores aleatorios de memoria hasta que encuentre uno con valor 0. A veces se bloqueará, cuando no se encuentre cero hasta que termine la memoria legible. Escribir código como este está prohibido y incorrecto también en Unix, y en cualquier otro sistema operativo.

0

El char * es en realidad una cadena en C. Así que supongo que está tratando de imprimirlo como una cadena.

Una forma de forzar a la dirección del puntero a imprimir es usar printf:

printf("%p\n", c); 
Cuestiones relacionadas