2011-12-01 9 views
8

Tengo el siguiente código.C punteros asignados? ¿Qué es esto?

char a[] = "abcde"; 
char *b = "fghij"; 
char *c = malloc(6); 
char *d = c; 
c = "klmno"; 

Y los estados de ejercicio:

hacer un dibujo de las estructuras de datos A, B, C y D (con contenido), donde se puede ver lo que se ha asignado y utilizar las flechas para muestra cómo se configuran los punteros .

Mi solución es:

 ____________ 
a -> |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ___________ 
d -> | | | | | | | 
     ¨¨¨¨¨¨¨¨¨¨¨ 

Sin embargo, mi solución no ser aceptado y la respuesta fue "memoria asignada para un puntero a b, c, d, pero no un". ¿Puede alguien explicarme qué significa esto?

+0

No está claro a partir de su pregunta cuál fue su respuesta y cuál fue su error. Intenta reformularlo para hacerlo más comprensible. – Neowizard

+2

@karlphillip, c no se rellenó, se reasignó. – Neowizard

+0

No, el contenido de 'c' no ** está ** copiado a' d'. –

Respuesta

9

Es una respuesta un poco críptico, pero supongo que la queja es que la matriz no se apunto a esos datos; es contiene los datos.

Así que esto podría ser lo que se requiere (sin el puntero de flecha):

____________ 
a |a|b|c|d|e|\0| 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 

El nombre de una matriz se puede utilizar como un puntero, pero todavía tiene un significado ligeramente diferente.

+0

Sí, eso es lo que pensé. Sin embargo, ¿la matriz no es esencialmente solo un puntero al primer elemento? – Pithikos

+2

El nombre de una matriz apunta al primer elemento de esa matriz. Es un puntero en este sentido. – karlphillip

+4

Parece que querían una foto como [esto] (http://c-faq.com/aryptr/aryptr2.html). –

7

quisiera llamar como esto:

 ____________ 
    |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
      a 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     _____________ 
d -> |g|a|r|b|a|g|e| 
     ¨¨¨¨¨¨¨¨¨¨¨¨¨ 

Aviso cómo el a está por debajo de todo el conjunto, no al lado de una flecha. Esto es para enfatizar que a es una matriz completa que contiene la cadena en sí misma, no solo un puntero. Esto muestra que se da cuenta de la diferencia entre un matriz y un puntero.

+0

No dibujaría 'a' exactamente de esta manera. Es __is__ un puntero –

+3

@Andrey: no, no lo es. Hay una clara diferencia entre una matriz y un puntero. Aunque los identificadores de matriz decaen a un puntero en ciertos contextos, eso no los convierte en punteros. Pruebe 'sizeof (a)' y 'sizeof (b)' y vea la diferencia usted mismo. –

+0

Sí, tienes razón en este punto. Pero en realidad no importa aquí, creo. –

1

El contenido de la memoria apuntando por d no está determinado en realidad. Debe contener un poco de basura que proviene de malloc() en c

1

Incluso trataría de distinguir dónde apuntaba la información.

____________ 
a|a|b|c|d|e|\0| (in data segment or on stack) 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
b|ptr->| -> |f|g|h|i|j|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
c|ptr->| -> |k|l|m|n|o|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ___________ 
d|ptr->| -> |X|X|X|X|X|X| (on heap) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨ 
1

creo que son bastante más justo:

char a[] = "abcde"; 
    printf("a[]: [%s] length:%d\n", a, strlen(a)); 

    char* b = "fghij"; 
    printf("*b: [%s] length:%d\n", b, strlen(b)); 

    char* c = (char*)malloc(6); 
    char* d = c; 

    c = "klmno"; 
    printf("*d = c: d is [%s] length:%d\n", d, strlen(d)); 
    printf("*d = c: c is [%s] length:%d\n", c, strlen(c)); 

Salidas:

a[]: [abcde] length:5 
*b: [fghij] length:5 
*d = c: d is [] length:0 
*d = c: c is [klmno] length:5 

Nota: A pesar de que strlen() busca el carácter NULL sean capaces de repetir en una matriz de cadenas y caracteres de conteo, la ocurrencia de NULL no se agrega a la suma final, es por eso que informa 5 caracteres en lugar de 6.

En cuanto a su respuesta no aceptada, es probable que exista alguna otra forma de representación que su profesor esperaba que usted hiciera para la matriz a, puede que le interese hablar con sus colegas al respecto, pero no creo justo decir que dio una respuesta incorrecta.