【问题标题】:Divide large malloc-block into smaller "partitions"将大型 malloc 块划分为更小的“分区”
【发布时间】:2009-10-13 15:42:26
【问题描述】:

有没有办法在大型 malloc 块上使用指针算法,以便您可以将多个结构或原始数据类型分配给已分配的区域?我正在写这样的东西,但它不起作用(试图将 200 个结构分配给 15000 字节的 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

【问题讨论】:

  • 你想错了。阅读“指针算法”并停止考虑 primDataPtr 是一个大块字节(字符)。例如,使用指针算法,如果你有一个指向 METADATA 的指针,那么 (pointer + 1) 将指向 METADATA 的下一个块,而不是下一个字节。这是编写可行解决方案的关键。阅读指针算术的精彩世界......以及正确的转换。

标签: struct pointers malloc math


【解决方案1】:

我唯一能看到的是:

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

应该是:

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

我想?

PS:你的malloc也可以只分配200 * sizeof(METADATA)

【讨论】:

    【解决方案2】:

    在 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]);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多