C - 来自先前分配的 void* 的 sizeof 值?

标签 c pointers memory

我正在创建一个文件,其工作专门用于跟踪我当前分配的 block 数量,因为我不希望出现任何内存泄漏。

size_t BLOCKS_CURRENTLY_ALLOCATED = 0;

/* Since variables can be allocated in lots of different ways,
malloc, calloc, realloc, etc don't allocate here. Just mark down
how many bytes of memory was used for this value. */
void allocate(const void const *val)
{
    BLOCKS_CURRENTLY_ALLOCATED += sizeof(*val);
}

/* Update the amount of blocks counter and free the pointer. */
void deallocate(const void const *val)
{
    // Edit: I think I meant to do `sizeof(val)` but I don't know if that works
    const size_t size = sizeof(*val);
    if (BLOCKS_CURRENTLY_ALLOCATED < size)
        exit(1); // Error, must have forgotten to report allocating.
    free(val);
    BLOCKS_CURRENTLY_ALLOCATED -= sizeof(size);
}

这段代码合法吗?我可以使用 sizeof获取为未知数据类型指针分配的 block 数量,该指针在某个时刻用 malloc 分配或calloc ?打电话free怎么样?位于数据为 const 的指针上指针为const

最佳答案

您的代码不遵循标准 C。

不能对 void 类型的变量使用 sizeof。这是某种无意义的、非标准的扩展。我猜它会给出尺寸 1 或类似的毫无意义的东西。即使它是有效的 C,您也不能像您想象的那样使用 sizeof 来获取未知类型的大小 - C 没有任何形式的运行时类型信息。

此外,您不能将 const void* 类型的指针传递给需要 void* 的函数。 C 不允许删除限定符的隐式指针转换。

总的来说,您需要一个更好的编译器,因为这段代码不可能通过编译。

顺便说一句,const void const * 是无稽之谈。您可能指的是 const void* const?前者与 const const const const const void* 一样没有什么意义,尽管 C 允许这样做。

关于C - 来自先前分配的 void* 的 sizeof 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434108/

相关文章:

c - 重新分配后如何更改保存的地址

c - Wireshark 插件导致 'heap corruption'

c++ - 链接究竟是如何工作的?

c - ‘sizeof’ 的无效应用和结构数据的编译错误

c - I2C 读取功能在发送确认位后卡住

algorithm - 数据结构中的卫星信息是什么?

c - 定义一个大于 unsigned int 限制的大型数组

c - 关于指针和数组以及类型和转换

c++ - Windows:在 C++ 中获取函数地址

c - SIGSEGV 内存访问冲突