2016-04-07 18 views
-1

Bir dosya sistemi oluşturmaya çalışıyorum ve dosya tanıtıcılarını belirtmem gerekiyor.Callocking memory

ı aşağıdaki tanımlarla iki yapıları var diyelim:

#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; 
}; 

hiçbir sorun ile yeni bir dosya sistemi callocing ediyorum:

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

ama İçimdeki fd_table calloc istediğimde benim sorunum arrises FS yapı. İşte denediğim şey.

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

Ben uygunluk konusunda bir hata alıyorum: eğer

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

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

birisi bana açıklayabilir ne ben yapıyorum yanlış ya

Bu seferki hiç hata üretir Süreçte tamamen yanlış mıyım? fd_pos'u bile işaretlemem gerekiyor mu?

+2

Sadece * tahmin edelim * FS_t nedir? Ve Fyi, bir tahsisin sağ tarafına herhangi bir dereferanslı tahsisatın tek bir açıklamada eklenmesi, bir bellek sızıntısı için bir reçete. Bu: fs-> fd_table = * (fd_table_t *) calloc (TABLE_MAX, sizeof (fd_table_t)); 'hiçbir anlam ifade etmiyor ve bunu yaparken bellek sızdırıyor. – WhozCraig

+0

oh bilirsin, bir yazım ekledim unuttum. Sorumu –

+0

düzenleyeceğim. Hata üretmiyordu ama korkunç, korkunç bir şekilde yanlış hissettim. –

cevap

1

fs->fd_table.fd_pos, bir işaretçi değil, bir dizidir. Dinamik bir dizi istiyorsanız, türü size_t* olarak değiştirin. Aksi takdirde, bir dizi olarak bırakmak ve dinamik ayırma kullanmamak mükemmel bir şekilde yapılır. Eğer (calloc yaptığı gibi) bellek sıfıra istiyorsanız Bu durumda, sadece memset kullanabilirsiniz:

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

Oh evet, ve ayrıca ilk örnek, bir kaçak olduğuna işaret WhozCraig (tahsis bellek, daha sonra dereferencing ve copying, ardından işaretçiyi kaybetme). Aslında, tüm yapı ilk calloc ile sıfırlandığından, yukarıda önerdiğim gibi memset'a ihtiyacınız yoktur.

+0

Ah! Bu çok daha mantıklı. Bu yüzden memset'i kullanmaktan sakınabilirim, ancak bellek sızıntılarını önlemek için ilk calloc'u nasıl değiştirmeliyim? –

+0

OH! İlk calloc! “FS_t” nin içinde calloc-ing olması gerekmiyor çünkü ilk calloc sıfırlama ile ilgiliydi, doğru mu? –

+1

İlk 'calloc', ayırdığınız ve 8 yapının (fs 'ile işaret edilen) bazı bellekler için sıfır olduğunu. Bu iyi. Diğer iki 'callocs' gerekli değildir. Aslında, sadece bu 8 yapıdan sadece birini etkiliyorlardı. – paddy