我正在尝试在 POSIX 中使用共享内存段,但在确定某个地址是否有内存时遇到了很多麻烦。
我看到了一个使用file_size = *(size_t *)ptr
其中 ptr 是对 mmap (.... ) 的调用返回的指针
我不太明白这是如何工作的。 *(size_t *)
类型转换有什么作用?我假设 (size_t)*var
会将指针 var 处的值转换为 size_t
类型。但是,当我再放一个星号时......这会再次给我一个指针,不是吗?
最佳答案
没有通用的方法来确定给定指针指向的已分配内存的大小。甚至它是否指向一个有效的对象。可能有一些特定于系统的方法来确定类似的东西,但它们可能不可靠——并且它们无法确定指针是否指向有效对象,而不是它应该指向的对象。
您只需自己仔细跟踪这些信息即可。
您描述的方法:
file_size = *(size_t *)ptr;
如果内存恰好是由专门存储分配区域开头的大小的东西分配的,则可以工作 - 但前提是您已经知道 ptr
有效。
ptr
可以是任何类型的指针(函数指针除外)。强制转换 (size_t *)
转换 ptr
的值,以便您可以将其视为指向 size_t
的指针对象(size_t
是用于表示大小的无符号整数类型)。使用 *
解引用运算符解引用该 size_t*
值即可获得 size_t
对象的值。
下面是一个假设的分配函数的示例,可能会以这种方式工作:
void *allocate(size_t size) {
void *result = malloc(sizeof (size_t) + size);
if (result != NULL) {
*(size_t*)result = size;
}
return result;
}
以及一个为您提供当前分配大小的函数:
size_t curr_size(void *ptr) {
return *(size_t*)ptr;
}
注意,这会忽略对齐问题。如果您为需要比 size_t
更严格对齐的内容分配内存,这可能会严重失败。
关于我可以在 C 中使用类型转换来获取指向地址的指针的内存大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638030/