2013-05-21 50 views
3

內部結構的記憶。如果我有兩個結構:Ç如何修改其他結構

typedef struct{ 
    unsigned int time; 
    double rate; 

}quote; 

typedef struct{ 

    unsigned int freeSlots; 
    unsigned int end; 
    unsigned int start; 
    unsigned int currSize; 
    unsigned int maxSize; 
    unsigned int startAt; 
    //unsigned int currIndex; 
    quote quoteBuffer[1]; 

}cbuf; 

,我想做出將修改內CBUF的quoteBuffer數組的大小,究竟會功能我去做那件事?我嘗試了一些方法,但目前爲止還沒有工作。我回頭率的格式相同:

quote *newQuoteBuffer = malloc(sizeof(quote) * newSize); 

如果我已經有一個現有CBUF地方(例如,我們將其稱之爲「A」,其中一個是指針CBUF):

a->quoteBuffer = newQuoteBuffer; 

但顯然這是行不通的。任何提示?

+0

'quote quoteBuffer [1]'這有什麼意義? – Kraken

+0

你不能改變'cbuf'結構?例如''quoteBuffer'是一個指針嗎? –

+0

初始化cbuf結構中的引號數組。我想我也可以引用quoteBuffer []。但是我之後使用了1,因爲稍後我將使用malloc來修改大小。 – user1806716

回答

2

此:

quote quoteBuffer[1]; 

應該是:

quote *quoteBuffer; 

然後分配將正常工作。

提領quote看起來是這樣的:

a->quoteBuffer->time; 

如果以後有使用malloc分配報價的多個元素(),你可以像這樣訪問他們:

a->quoteBuffer[i].time; 
+0

如果我想用新的替換當前的quoteBuffer,它會簡單地是cbuf-> quoteBuffer = newBuffer? – user1806716

+1

是的,但不要忘記首先釋放()它,否則會造成泄漏。當然,如果不使用,將它初始化爲NULL總是一個好主意。 – Devolus

+0

是的,應該這樣做。 – Kraken

1

如果你不知道的有多少元素會進入quoteBuffer,保持相同的鏈表。爲此

quote *quoteBuffer; 

並根據需要繼續添加或從緩衝區中刪除元素。

0

有兩種方法。一種是使用在CBUF指針,正如其他人所提到的,通過改變

quote quoteBuffer[1]; 

quote* quoteBuffer; 

另一種是調整CBUF:

#include <stddef.h> // for offsetof 

struct cbuf* realloc_cbuf(struct cbuf* cbufp, size_t nquotes) 
{ 
    struct cbuf* new_cbufp = realloc(cbufp, offsetof(struct cbuf, quoteBuffer) + nquotes * sizeof *cbufp->quoteBuffer); 
    if (!new_cbufp) 
    { 
     // handle out of memory here. cbufp is still intact so free it if you don't need it. 
    } 
    return new_cbufp; 
} 

void elsewhere(void) 
{ 
    struct cbuf* acbuf = NULL; 
    acbuf = realloc_cbuf(1); 
    acbuf = realloc_cbuf(10); 
    // etc. 
} 
1

我想你」重新忽略了爲什麼有人會將結構的最後一個元素作爲單個元素數組。這是在舊C代碼中使用的一種技巧,可以使結構大小變長。

您可以編寫代碼,例如這樣的:

Bitmapset *p = malloc(offsetof(Bitmapset, quoteBuffer) + n * sizeof(quote)); 

然後你寫這樣的代碼:

p->quoteBuffer[0] 

達:

p->quoteBuffer[n-1] 

你不想要分配正如你猜測的那樣,直接指向quoteBuffer的指針。

那麼,爲什麼要聲明quoteBuffer爲: quote quoteBuffer [1]; 而不是 報價* quoteBuffer; ?

這是因爲你不想爲quoteBuffer單獨分配。一個分配可以用於整個cbuf,包括內聯引用數組。