gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:11:00 25 4
gpt4 key购买 nike

我正在创建一个文件,其工作专门用于跟踪我当前分配的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com