Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在C中使用类型转换来获取指向地址的指针处的内存大小吗?_C_Pointers_Memory - Fatal编程技术网

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

我可以在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类型。但是,当我加上另一个星号。。。这会再次给我一个指针,不是吗 没有通用的方法来确定给定指针指向的已分配内存的大小。甚至它是否指向有效的对象。可能有一些特定于系统的方法来

我试图在POSIX中使用共享内存段,但在确定某个地址是否有内存时遇到了很多麻烦

我看到了一个使用
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*
)的指针,此表达式前面的*取消引用指针以获取值。