2012-01-06 2 views
8

Sto facendo la stessa cosa in entrambi i codici.Differenza tra array di caratteri e puntatore

Nel codice 1: ho utilizzato uno char * e allocare lo spazio utilizzandoin main.

Nel codice 2: Ho utilizzato un array char per lo stesso scopo. Ma perché l'output è diverso?

Codice 1:

struct node2 
{ 
    int data; 
    char p[10]; 
}a,b; 

main() 
{ 
    a.data = 1; 

    strcpy(a.p,"stack"); 
    b = a; 
    printf("%d %s\n",b.data,b.p);  // output 1 stack 
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p);  // output 1 overflow 
    printf("%d %s\n",a.data,a.p);  // output 1 stack 
} 

Codice 2:

struct node1 
{ 
    int data; 
    char *p; 
}a,b; 

main() 
{ 
    a.data = 1; 
    a.p = malloc(100); 
    strcpy(a.p,"stack"); 
    b = a; 
    printf("%d %s\n",b.data,b.p); //output 1 stack 
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p); // output 1 overflow 
    printf("%d %s\n",a.data,a.p); // output 1 overflow(why not same as previous one?) 
} 
+1

@birryree 'b.p' è poco profondo copiato da' a.p'. – Chad

+0

@Chad - Sì, ho perso la riga 'b = a', quindi ho cancellato il mio commento. – birryree

+0

@Chad -che cos'è questa copia superficiale? –

risposta

10

Nel secondo esempio si sta assegnando a-b, il che significa che a.p (char*) viene assegnato a b.p. Pertanto la modifica della memoria indicata da b.p modifica anche la memoria indicata da a.p, poiché puntano entrambi alla stessa posizione nella memoria.

Nel primo esempio, si dispone di due array separati. Assegnazione a a bcopie ciascuna char nella matrice a.p-b.p - questi blocchi di memoria sono parte del struct, non sono puntatori a una parte specifica in memoria. Qualsiasi modifica a b.p in questo caso non può influire su a.p poiché sono completamente indipendenti.

3

I puntatori di caratteri e gli array di caratteri non sono la stessa cosa.

Il nodo con l'array viene copiato, quindi il contenuto viene copiato nel nuovo nodo. Quando si inserisce il nuovo valore (overflow) nel nodo copiato (b), esso sovrascrive solo la copia.

Il nodo con il puntatore del carattere ottiene il valore del puntatore copiato, quindi entrambi i nodi puntano alla stessa posizione di memoria. Quando si inserisce il nuovo valore (overflow) nel nodo copiato (b), esso scrive nella memoria a cui entrambi i nodi hanno un puntatore.

3

Nel primo codice, la struttura contiene una matrice di caratteri effettiva (char[10]), quindi quando si copia la struttura (b = a) viene anche copiata la matrice. Quindi sovrascrivi uno di loro ma non l'altro.

Nel secondo codice, la struttura contiene un puntatore a un carattere, quindi quando si copia la struttura il puntatore viene copiato, ma i dati non lo sono. Quindi entrambi puntano agli stessi dati.