在C中,是否将void *
作为参数传递给free
函数错误练习?如果没有,该函数将如何从void *
指向的位置开始知道要释放多少内存?
答案 0 :(得分:8)
free()
只需要内存块的起始地址;它的内容无所谓。这就是为什么它的签名中实际上有一个void*
(因此无论你传递什么样的指针都没关系,它总会得到一个void*
)。
free()
函数释放了ptr
指向的内存空间,该内存空间必须在之前调用malloc()
,calloc()
或realloc()
时返回
如您所见,您可能只释放由其中一个函数分配的内存 - 并且它们会在内部存储块的大小。
如果您感到好奇,甚至不需要将信息存储在单个位置的单独结构中;例如,默认malloc
/ free
的各种替换常见的是分配N + M字节的内存,其中M是元数据结构的大小。在该分配返回的地址处,它们存储自己的元数据(例如分配的大小),然后返回ptr + M,它指向元数据后面的内存。
当释放该内存时,它可以简单地从地址中减去M以获得指向元数据的初始指针。
答案 1 :(得分:0)
免费不需要数据类型,void *
将正常工作。内部管理释放多少内存。重要的是,您将先前从兼容分配函数获得的值传递给free
:malloc
并且它是朋友。
答案 2 :(得分:0)
free()
实现应该从传递的指针知道要释放的大堆单元是多少。必须从malloc()
,calloc()
或realloc()
获取指针。确切的方式可能因平台而异 - 为便携式代码,不应假设技术细节。
void*
是指定参数类型的好方法,因为它可以享受任何其他指针类型的隐式降级转换。
答案 3 :(得分:-1)
没有真正的释放内存,它只是允许其他程序在这里分配内存。
顺便说一句,如果你想要正确记忆的长度你有strlen
的功能。 (不确定那个)