2009-10-13 57 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]); 
}