2010-04-05 23 views
33

he definido como una estructura:programación C: Desreferenciar puntero al error de tipo incompleto

struct { 
char name[32]; 
int size; 
int start; 
int popularity; 
} stasher_file; 

y una matriz de punteros a esas estructuras:

struct stasher_file *files[TOTAL_STORAGE_SIZE]; 

En mi código, estoy haciendo un puntero a la estructura y el establecimiento de sus miembros, y de añadir a la matriz:

... 
struct stasher_file *newFile; 
strncpy(newFile->name, name, 32); 
newFile->size = size; 
newFile->start = first_free; 
newFile->popularity = 0; 
files[num_files] = newFile; 
... 

estoy recibiendo el siguiente error:

error: dereferencing pointer to incomplete type

cada vez que intento acceder a los miembros dentro de newFile. ¿Qué estoy haciendo mal?

+0

Gracias a todos por la ayuda :) – confusedKid

+0

Por cierto, tuve el mismo error, pero el problema fue que no incluí un archivo de encabezado específico (en un proyecto grande). – ady

Respuesta

41

No ha definido struct stasher_file por su primera definición. Lo que ha definido es un tipo de estructura sin nombre y una variable stasher_file de ese tipo. Como no hay una definición para el tipo struct stasher_file en su código, el compilador se queja del tipo incompleto.

Con el fin de definir struct stasher_file, que debería haber hecho de la siguiente manera

struct stasher_file { 
char name[32]; 
int size; 
int start; 
int popularity; 
}; 

Nota donde el nombre stasher_file se coloca en la definición.

+1

+1 Más rápido que yo, y usar 'struct stasher_file' en lugar de' typedef' es consistente con el uso del tipo de OP en el ejemplo. – Dirk

13

Está utilizando el puntero newFile sin asignarle espacio.

struct stasher_file *newFile = malloc(sizeof(stasher_file)); 

También debe poner el nombre de la estructura en la parte superior. Donde ha especificado stasher_file es crear una instancia de esa estructura.

struct stasher_file { 
    char name[32]; 
    int size; 
    int start; 
    int popularity; 
}; 
+0

¿Cómo le asigno espacio? – confusedKid

+0

No asigné espacio para newFile, pero cambié la definición de stasher_file para que sea como la tuya, y el error no apareció. ¿Todavía necesito asignar espacio? – confusedKid

+1

@confuseKid: sí, necesitas asignar el espacio como di. También asegúrese de liberarlo cuando haya terminado con él. –

10

¿Cómo definió realmente la estructura? Si

struct { 
    char name[32]; 
    int size; 
    int start; 
    int popularity; 
} stasher_file; 

se ha de tomar como definición de tipo, que le falta un typedef. Cuando se escribe como arriba, realmente se define una variable llamada stasher_file, cuyo tipo es un tipo de estructura anónima.

Trate

typedef struct { ... } stasher_file; 

(o, como ya se ha mencionado por otros):

struct stasher_file { ... }; 

En efecto, éste se adapte a su uso del tipo. El primer formulario requeriría que elimine el struct antes de las declaraciones de variables.

1

La razón por la que está recibiendo este error se debe a que ha declarado su struct como:

struct { 
char name[32]; 
int size; 
int start; 
int popularity; 
} stasher_file; 

Esto no es declarar un tipo stasher_file. Esto está declarando un tipo anónimo struct y está creando una instancia global llamada stasher_file.

lo que pretendía era:

struct stasher_file { 
char name[32]; 
int size; 
int start; 
int popularity; 
}; 

Pero tenga en cuenta que si bien la respuesta de Brian R. Bondy no era correcta sobre su mensaje de error, tiene razón que usted está tratando de escribir en el struct sin haber asignado espacio para ello. Si quieres una matriz de punteros a struct stasher_file estructuras, tendrá que llamar malloc para asignar espacio para cada uno:

struct stasher_file *newFile = malloc(sizeof *newFile); 
if (newFile == NULL) { 
    /* Failure handling goes here. */ 
} 
strncpy(newFile->name, name, 32); 
newFile->size = size; 
... 

(Por cierto, tener cuidado al usar strncpy, no está garantizado que NUL-terminar.)

+0

si tiene una estructura definida como typedef struct {...} stasher_file; entonces puedes usar malloc como stasher_file * newFile = malloc (sizeof (stasher_file); – katta

+0

@katta Sí, pero mucha gente considera que es una mejor práctica hacer 'T * p = malloc (sizeof * p)' en su lugar. si el tipo de 'p' cambia alguna vez, solo debe actualizar su declaración y no los sitios' malloc'. Olvidarse de actualizar los sitios 'malloc' asignaría silenciosamente la cantidad incorrecta de memoria, lo que podría derivar en desbordamientos del buffer – jamesdlin

+0

@ katta También vea http://stackoverflow.com/questions/373252/c-sizeof-with-a-type-or-variable – jamesdlin

5

el caso anterior es para un nuevo proyecto. Me encuentro con este error al editar un tenedor de una biblioteca bien establecida.

typedef se incluyó en el archivo que estaba editando pero la estructura no lo estaba.

El resultado final fue que estaba intentando editar la estructura en el lugar equivocado.

Si te topas con esto de manera similar, busca otros lugares donde se edite la estructura y pruébalo allí.

+1

+1, ¡ya que esta observación me puso en el camino correcto! – Ludo

Cuestiones relacionadas