【发布时间】:2015-04-06 23:48:03
【问题描述】:
我练习用 C 实现内存管理器。
我想要具有各种长度和自我描述的结构。 所以,我偷看一本 POSIX 教科书,就像这样:
struct layout
{
uint32_t size; // array size in bytes, include space after the struct
uchar_t data[1];
};
// But, is next line correct?
layout *val = malloc (array_memory_in_bytes + sizeof (uint32_t) - 1);
// Where does a static array keep the pointer for using it?
如果我在不间断的内存中一个接一个地有几个这样的结构,我希望能够遍历它们。我可以写点东西吗,比如:
layout *val1 = pointer;
layout *val2 = val1 + val1.size + sizeof (val1.size);
或者你能推荐我一个更好的方法吗?
【问题讨论】:
-
看起来相当合理,尽管您可能希望/需要在对象之间添加对齐。如果您有 C99 编译器,请使用灵活的数组成员。
-
根据平台的不同,您可能需要考虑“大小”和“数据”之间的填充。如果可以的话,你应该明确定义结构的包装以确保没有任何额外的空间。
-
@doynax,感谢您使用“灵活数组成员”一词,我找到了问题的答案stackoverflow.com/a/247040/864113
-
@joshpoley,行'结构布局 val = malloc( sizeof *val + (number_of_bytes - 1)); / 不灵活 */' 不依赖于打包方式
-
关于“静态数组在哪里保存使用它的指针?” ,它没有。这样的指针是根据需要创建的右值。
标签: c memory-management struct