2012-01-06 23 views
8

Estoy haciendo lo mismo en ambos códigos.Diferencia entre la matriz de caracteres y el puntero

En el código 1: He utilizado un char * y asignar el espacio usando malloc en main.

En el código 2: He utilizado una matriz char para el mismo propósito. Pero, ¿por qué la salida es diferente?

Código 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 
} 

Código 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' tiene una copia poco profunda de' a.p'. – Chad

+0

@Chad - Sí, me perdí la línea 'b = a', así que borré mi comentario. – birryree

+0

@Chad-¿qué es esta copia superficial? –

Respuesta

10

En el segundo ejemplo que está asignando a ab, lo que significa que a.p (char*) está siendo asignado a b.p. Por lo tanto, la modificación de la memoria apuntada por b.p también está modificando la memoria apuntada por a.p, ya que los apuntan a la misma ubicación en la memoria. En el primer ejemplo, tiene dos matrices separadas. Asignación a a bcopias cada char en la matriz a.p-b.p - estos bloques de memoria son parte de la struct, no son punteros a una parte específica de la memoria. Cualquier modificación a b.p en este caso no puede afectar a.p ya que no tienen ninguna relación.

3

Los punteros de caracteres y las matrices de caracteres no son lo mismo.

Su nodo con la matriz se está copiando, por lo que los contenidos se copian en el nuevo nodo. Cuando coloca el nuevo valor (desbordamiento) en el nodo copiado (b), solo sobrescribe la copia.

Su nodo con el puntero de carácter obtiene el valor del puntero copiado, por lo que ambos nodos apuntan a la misma ubicación de memoria. Cuando coloca el nuevo valor (desbordamiento) en el nodo copiado (b), escribe en la memoria que ambos nodos tienen un puntero.

3

En su primer código, la estructura contiene una matriz de caracteres real (char[10]), de modo que cuando copie la estructura (b = a) la matriz también se copiará. Luego sobrescribe uno de ellos pero no el otro.

En su segundo código, la estructura contiene un puntero a un carácter, por lo que cuando copia la estructura, el puntero se copia, pero los datos no. Entonces ambos apuntan a la misma información.

Cuestiones relacionadas