我可以在C中使用类型转换来获取指向地址的指针处的内存大小吗?
我试图在POSIX中使用共享内存段,但在确定某个地址是否有内存时遇到了很多麻烦 我看到了一个使用我可以在C中使用类型转换来获取指向地址的指针处的内存大小吗?,c,pointers,memory,C,Pointers,Memory,我试图在POSIX中使用共享内存段,但在确定某个地址是否有内存时遇到了很多麻烦 我看到了一个使用file\u size=*(size\u t*)ptr 其中ptr是对mmap(..) 我真的不明白这是怎么回事。*(size\u t*)类型转换做什么?我假设它(size\u t)*var会将指针var处的值转换为size\u t类型。但是,当我加上另一个星号。。。这会再次给我一个指针,不是吗 没有通用的方法来确定给定指针指向的已分配内存的大小。甚至它是否指向有效的对象。可能有一些特定于系统的方法来
file\u size=*(size\u t*)ptr
其中ptr是对mmap(..)
我真的不明白这是怎么回事。*(size\u t*)
类型转换做什么?我假设它(size\u t)*var
会将指针var处的值转换为size\u t
类型。但是,当我加上另一个星号。。。这会再次给我一个指针,不是吗 没有通用的方法来确定给定指针指向的已分配内存的大小。甚至它是否指向有效的对象。可能有一些特定于系统的方法来确定类似的内容,但它们可能不可靠——而且它们无法确定指针是否指向有效对象,而不是它应该指向的对象
你只需要自己仔细跟踪这些信息
您描述的方法:
file_size = *(size_t *)ptr;
如果内存恰好是由特定存储在分配区域开头的大小的内容分配的,则可以工作,但前提是您已经知道ptr
是有效的
ptr
可以是任何类型的指针(函数指针除外)。cast(size\u t*)
转换ptr
的值,因此可以将其视为指向size\u t
对象的指针(size\u t
是用于表示大小的无符号整数类型)。使用*
取消引用运算符取消引用该size\u t*
值将为您提供size\u 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
需要更严格对齐,则此操作可能会严重失败。它会读取内存位置的第一个sizeof(size\t)
字节。如果有人在那里写了内存块的大小,您可以从该位置读取它。您可以使用“&”获取指针。“*”遵从指针并获取您的值。@mch感谢您的响应,因此如果我使用*(int*)mem,这将读取该位置的第一个大小的(int)字节?您无法测试内存是否存在。您需要通过其他方式知道。(size\u t*)ptr
将ptr
强制转换为指向size\u t
(又称size\u t*
)的指针,此表达式前面的*取消引用指针以获取值。