2016-04-07 15 views
-1

Ich versuche, ein Dateisystem zu erstellen, und ich muss die Dateideskriptoren aufrufen.Callocing-Speicher

Sagen wir, ich habe zwei Strukturen mit den folgenden Definitionen:

#define DESCRIPTOR_MAX (256) 
#define TABLE_MAX (32) 

typedef struct S16FS S16FS_t;

typedef struct { 
    bitmap_t *fd_status; 
    size_t fd_pos[DESCRIPTOR_MAX]; 
    inode_ptr_t fd_inode[DESCRIPTOR_MAX]; 
} fd_table_t; 

struct FS { 
    back_store_t *bs; 
    fd_table_t fd_table; 
}; 

Ich callocing ein neues Dateisystem ohne Probleme:

FS_t *fs = (FS_t *)calloc(8, sizeof(FS_t)); 

aber Mein Problem tritt auf, wenn ich die fd_table innerhalb Callocaloc das FS struct. Hier ist was ich versuche.

Dieser erzeugt keine Fehler:

fs->fd_table = *(fd_table_t*)calloc(TABLE_MAX, sizeof(fd_table_t)); 

Ich erhalte eine Fehlermeldung mit den folgenden:

fs->fd_table.fd_pos = (size_t *)calloc(TABLE_MAX, sizeof(size_t)); 

error: array type 'size_t [256]' is not assignable

mir jemand erklären kann, was ich falsch mache oder wenn Ich liege in meinem Prozess völlig falsch? Muss ich die fd_pos sogar anrufen?

+2

Sollten wir nur * raten * was 'FS_t' ist? Und Fyi, eine beliebige dereferenzierte Zuweisung auf der rechten Seite einer Zuweisung in einer einzigen Anweisung zu setzen, ist ein Rezept für ein Speicherleck. Dies ist: 'fs-> fd_table = * (fd_table_t *) Calloc (TABLE_MAX, sizeof (fd_table_t));' macht überhaupt keinen Sinn und verliert währenddessen Speicher. – WhozCraig

+0

oh du weißt, ich habe vergessen, ein Typedef hinzuzufügen. Ich werde meine Frage bearbeiten –

+0

Das ist, was ich dachte. Es erzeugte keine Fehler, aber es fühlte sich schrecklich, schrecklich falsch an. –

Antwort

1

Es sieht aus wie fs->fd_table.fd_pos ist ein Array, kein Zeiger. Wenn Sie ein dynamisches Array möchten, ändern Sie den Typ in size_t*.

Ansonsten ist es völlig in Ordnung, es als Array zu lassen und keine dynamische Zuweisung zu verwenden. In diesem Fall, wenn Sie den Speicher auf Null wollen (wie calloc der Fall ist), können Sie einfach memset verwenden:

memset(fs->fd_table.fd_pos, 0, sizeof(fs->fd_table.fd_pos)); 

Ach ja, und auch WhozCraig darauf hinweist, dass Ihr erstes Beispiel ist der Speicher ein Leck (Zuweisung, dann Dereferenzieren und Kopieren, gefolgt von Verlust des Zeigers). In der Tat brauchen Sie nicht memset, wie ich oben vorgeschlagen, weil die gesamte Struktur mit der ersten calloc Null gesetzt wurde.

+0

Ah! Das macht viel mehr Sinn. So kann ich das Memset vermeiden, aber wie sollte ich das erste Calloc bearbeiten, um Speicherlecks zu vermeiden? –

+0

OH! Das allererste Calloc! Ich muss nicht anrufen, was sich in der 'FS_t' befindet, weil das anfängliche Calloc für die Nullstellung gesorgt hat, richtig? –

+1

Das erste "calloc" ist dasjenige, in dem Sie Speicher für 8 Strukturen zuweisen und auf Null setzen (auf "fs" gezeigt). Das ist in Ordnung. Die anderen zwei "Callocs" sind nicht erforderlich. Tatsächlich betrafen sie nur die erste dieser 8 Strukturen. – paddy