相关代码是:

typedef unsigned long int chunk_head;

typedef struct malloc_chunk
{
    // Contains the size of the data in the chunk and the flag byte.
    chunk_head      head;

    // Deliberately left unsized to allow overflow. 
    // Contains the payload of the chunk.
    unsigned int    data[];
};

仅作为一个例子,“获得”宏是这样的:

//Get the size of the data contained within the chunk.
#define GET_CHUNK_SIZE(chunk) ((chunk.head) & 0xFFFFFF)

高位字节我正在使用标志位 - “inuse”和“可以合并”,我找到的任何其他的将是有用的。

现在我已经完成了提供背景信息,正如我在标题中所说的那样,我需要能够将较低的3个字节更改为块的大小。我最初的本能是按位和大小的标头,因为它会正确对齐,但后来我意识到它也可能会覆盖标志字节,因为它会自动加上零,直到它的大小与长整数相匹配。我甚至不确定你可以按位和一个int和一个long。无论如何,非常感谢。

有帮助吗?

解决方案

怎么样:

head = (head & 0xff000000) | (new_size & 0x00ffffff)

其他提示

出于某种原因,到目前为止,您收到的大多数答复都坚持要清除地毯下潜在的尺寸溢出问题,即它们“和” 0x00FFFFFF 的块大小因此安静地丢弃过大的位(如果有的话),然后继续将大小完全无意义的尾部写入字段。我不知道为什么有人会这样做。

更合理的代码可能如下所示

assert((size & 0xFF000000) == 0);
chunk.head = (chunk.head & 0xFF000000) | size;

没有正当理由“和” 0x00FFFFFF 的大小。你应该中止或至少断言过大,不要悄悄地丢弃多余的东西。

使用位字段执行此操作。它避免了必须使用宏,在调试器中也很好:

typedef struct chunk_head {
  unsigned size:24;
  unsigned inuse:1;
  unsigned cancoalesce:1;
  // Room for 6 more...
};

typedef struct malloc_chunk {
  struct chunk_head head;
  int data[];
};

chunk.head =(chunk.head& ~0xffffffL)| (new_lower_bits)

// retain the old top 8 bits
chunk.head &= 0xFF00000000

// set the lower 24 bits
chunk.head |= (0x00FFFFFF & new_bits)
#define SET_CHUNK_SIZE(chunk, size) (chunk.head = (chunk.head & 0xFF000000) | (size & 0x00FFFFFF))

这是你的意思还是我错过了什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top