2008-12-11 62 views
0

這是一個相當基本的問題,由於某種原因,目前適當的解決方案逃脫了我。我處理的第三方SDK其聲明如下結構:如何在不導致內存損壞的情況下將數據存儲在可變長度數組中?

struct VstEvents 
{ 
    VstInt32 numEvents; ///< number of Events in array 
    VstIntPtr reserved; ///< zero (Reserved for future use) 
    VstEvent* events[2]; ///< event pointer array, variable size 
}; 

即使這是一個「可變大小」陣列,它的靜態聲明。很顯然,如果我創建一個VstEvents對象,將numEvents設置爲某個值,然後開始將它們添加到數組中,這會導致內存損壞。

那麼我該如何妥善處理這樣的結構呢?我應該分配我自己的VstEvent *數組,然後將事件[0]指向它嗎?

回答

0

如果你知道有多少,你可以用

struct VstEvents *evnts; 

evnts = (struct VstEvents*)malloc(sizeof(struct VstEvents) + 
            numEvents*sizeof(VstEvent*)); 

分配呢?這將撥出2個額外插槽

+0

在C中,不應該從malloc()強制返回值。這樣做可以隱藏錯誤。 – unwind 2008-12-11 12:19:57

+0

這在C89中才是真實的。在C99中,你不能使用隱式函數聲明,所以不管你是否投射都沒有區別。 Casting使得代碼可以在C++下編譯。 – 2008-12-13 06:48:22

-1

什麼結構被宣告爲指針數組(大小2)到VstEvent對象。您應該分配一個VstEvent並將其分配給事件[0],並將numEvents設置爲1.如果您有2個VstEvent,則分配另一個VstEvent,將其分配給事件[1],並將numEvents設置爲2.如果需要多於2個,那麼您需要對VstEvents進行realloc以增加其大小,以便事件包含您需要的指針數量並根據需要分配給2,3,4 ...。或者,如果您事先知道需要存儲多少事件,則可以在@ SDX2000顯示時將其初始分配。

我認爲其基本思想是爲了方便他們用大小2聲明它,所以如果你只有1或2,你不需要額外的malloc來設置事件數組的大小。

3

你需要預先分配的內存足夠大,以包含整個事情+任何您想要的附加記錄一大塊......

struct VstEvents 
{ 
    VstInt32 numEvents; ///< number of Events in array 
    VstIntPtr reserved; ///< zero (Reserved for future use) 
    VstEvent* events[2]; ///< event pointer array, variable size 
}; 

#define numEventsRequired 10 
VstEvents *vstEvents = (VstEvents*)malloc(sizeof(VstEvents) + sizeof(VstEvents*)*(numEventsRequired-2)); 

vstEvents->numEvents = numEventsRequired; 
0

您的第三方庫是一個有點奇怪。需要「的可變大小的數組」

  • 當陣列被分配的大小是已知的兩類之間進行區分,並將其從未此後改變。這是一個簡單的例子,下面我將展示一個C99習慣用法。當數組分配和陣列可能需要在其生命週期成長

  • 最終的大小是未知的。對於這樣的事情,我建議你在Dave Hanson的C Interfaces and Implementations的源文件seq.c中查看Seq_T的實現。你可以很容易地調整他的代碼。

如果你知道在分配時的尺寸,C99的成語是:

struct VstEvents 
{ 
    VstInt32 numEvents; ///< number of Events in array 
    VstIntPtr reserved; ///< zero (Reserved for future use) 
    VstEvent* events[]; ///< event pointer array, variable size 
}; 


struct VstEvents *alloc_vst_events(int num_events) { 
    struct VstEvents *p = 
      malloc(sizeof(*p) + num_events * sizeof(p->events[0])); 
    return p; 
} 

的關鍵在於,在結構怪異的數組的大小不指定。需要C99。

既然你堅持與第三方古怪我想試試這個:

#define NELEMS(A) (sizeof(A)/sizeof((A)[0])) 

struct VstEvents *alloc_vst_events(int num_events) { 
    struct VstEvents *p; 
    int events_needed = num_events - NELEMS(p->events); 
    p = malloc(sizeof(*p) + events_needed * sizeof(p->events[0])); 
    return p; 
} 

免責聲明:我沒有通過編譯器推此代碼。更正歡迎。

相關問題