Matrice di puntatori in C ++.

0

Non capisco l'output di questo,

#include <iostream>
using namespace std; 

// pointers and arrays 
char ch1 = 'a' ,  ch2= 'b';

char ch3[6] = {'c', 'd', 'e', 'f', 'g' , 'h'};

char *ptr[3]; 

int main ()
{
    ptr[0] = &ch1 ;

    ptr[2] = ch3;
    cout << &ch1 << endl;
}   

L'out put è abcdefgh.

non è & ch1 dovrebbe dare l'indirizzo di ch1? Non riesco a capire perché l'output dovrebbe essere abcdefgh.

    
posta Theorem 11.06.2014 - 17:32
fonte

2 risposte

7

L'espressione &ch1 effettivamente produce l'indirizzo di ch1 . La ragione per cui abcdefgh è stampata è cout ha un sovraccarico char* che stampa la stringa terminata da NUL a partire dall'indirizzo specificato. In questo caso, accade solo che ch2 , ch3 e un NUL seguano immediatamente ch1 in memoria in modo da ottenere abcdefgh stampato.

Come cita @rachetfreak, questo è un comportamento indefinito. È illegale accedere a più di un carattere tramite &ch1 perché è un puntatore a un singolo carattere. Su piattaforme diverse potresti ottenere output diversi o un arresto anomalo.

Se vuoi effettivamente stampare l'indirizzo di ch1 puoi lanciarlo su void* in modo che cout non assuma che sia un puntatore a una stringa:

cout << (void*)&ch1 << endl;
    
risposta data 11.06.2014 - 17:50
fonte
0

Nel codice visualizzato, ch1 e ch2 sono caratteri che vengono dichiarati consecutivamente e ch3 è in realtà una matrice di caratteri. L'operatore << interpreta l'indirizzo di ch1 come una stringa in stile C, che è solo un puntatore a un array di caratteri con terminazione null. Quindi, la cosa interessante per me è che la memorizzazione dell'indirizzo di ch1 in ptr[0] produce un carattere nullo (il numero 0) che appare nel byte dopo 'g'. Come dichiarato da @AndrewMedico, si tratta di un comportamento specifico del compilatore. Penso che il codice avesse lo scopo di mostrare come le stringhe C sono interpretate dai flussi IO e quanto sia facile per bug e falle di sicurezza insinuarsi in un codice altrimenti buono.

    
risposta data 11.06.2014 - 17:54
fonte

Leggi altre domande sui tag