我可以在 C 中使用类型转换来获取指向地址的指针的内存大小吗?

标签 c pointers memory

我正在尝试在 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/

相关文章:

c++ - 无窗口 OpenGL

c - 我需要将指针从结构单独写入文件吗?

c++ - 访问类QList指针的成员

c++ - 在 MSVC 中,Operator new 在 Debug 模式下的行为与 Release 模式下的行为不同

c - 结构数组中的内存对齐

c - 我正在尝试创建一个函数来接受用户输入的回文。为什么我输入一个数组后,它会自动输入其余的数组?

c - 尝试取消引用动态分配的指针时出现段错误

c++ - 创建和使用指向友元类方法的 func 指针

c - Scanf - 每个引用的变量 VS 每个引用的参数

R 尽管内存似乎可用,但无法分配内存