2009-10-13 103 views
1

有沒有辦法在一個大的malloc塊上使用底點算術,所以你可以給已分配的區域分配多個結構或原始數據類型?我寫這樣的事情,但它不是工作(試圖分配200層結構的15000byte malloc的區域):將較大的malloc塊劃分成較小的「分區」

char *primDataPtr = NULL; 


typedef struct Metadata METADATA; 

struct Metadata { 
    . 
    . 
    . 
};/*struct Metadata*/ 


. 
. 
. 




primDataPtr = (void*)(malloc(15000)); 
if(primDataPtr == NULL) {  
    exit(1); 
} 

char *tempPtr = primDataPtr; 
int x; 
for(x=0;x<200;x++) { 
     METADATA *md = (void*)(primDataPtr + (sizeof(METADATA) * x)); 
}//end x -for 
+1

你在想這個錯誤的方式。閱讀「指針算術」並停止考慮primDataPtr是一大塊字節(字符)。例如,使用指針算術,如果你有一個指向METADATA的指針,那麼(pointer + 1)將指向METADATA的下一個塊,而不是下一個字節。這是編寫可行的解決方案的關鍵。閱讀指針算術的精彩世界......並進行適當的投射。 – 2009-10-13 17:46:30

回答

1

我能看到的唯一的事情就是:

METADATA *md = (void*)(primDataPtr + (sizeof(METADATA) * x)); 

應該是:

METADATA *md = (METADATA *)(primDataPtr + (sizeof(METADATA) * x)); 

我覺得呢?

PS:您的malloc也可能剛剛分配200 * sizeof(METADATA)

0

在C語言中,指向某個東西的語法就像是一些東西的語法。你只需要小心索引範圍:

#define ARRAY_SIZE_IN_BYTES (15000) 

void *primDataPtr = (void*) malloc(ARRAY_SIZE_IN_BYTES); 
assert(primDataPtr); 

METADATA *md = (METADATA *)primDataPtr; 
for (x=0; x<(ARRAY_SIZE_IN_BYTES/sizeof(METADATA)); x++) { 
    do_something_with(md[x]); 
}