提问人:Adi bhai 提问时间:4/12/2023 最后编辑:user16217248Adi bhai 更新时间:4/12/2023 访问量:125
C 如何释放动态分配数组的所有字节?
How does C free all bytes of a dynamically allocated array?
问:
#include <stdio.h>
#include <stdlib.h>
int main(){
int * ptr = (int*)malloc(sizeof(int)*100); // Allocated space for 100 integers
// Some code
free(ptr); // Calling free with ptr as argument
return 0;
}
这如何释放所有 400 字节(在我的情况下)? 内存中只包含一个字节的地址,而且我没有传递任何其他参数来指定动态数组的大小,以便它可以运行循环并释放所有字节
ptr
如果我这样做会发生什么:
ptr++; free(ptr);
既然我们不能通过给出指针来检索堆中数组的大小,那么这意味着不知道保留了多少字节,那么为什么它不从前一个数组的中间开始分配另一个堆内存呢?
malloc()
ptr
答:
5赞
user16217248
4/12/2023
#1
/ 例程的一部分包括存储元数据,例如内存块有多大。通常,此数据存储在 返回的指针之前的字节处。在此处阅读更多内容。
malloc
free
free()
malloc()
由于指针的递增值不是以前由 、 或 返回的值,因此 return by 的代码调用了未定义的行为。 可能会尝试访问假定与分配块开头的固定偏移量的簿记数据,但发现垃圾并剧烈崩溃。或者也许会发生完全不同的事情。您无法可靠地预测调用未定义行为时会发生什么。
malloc()
calloc()
realloc()
ptr++; free(ptr);
ptr
malloc()
free()
评论
3赞
Eric Postpischil
4/12/2023
@user16217248:在许多情况下,专家可以可靠地预测所谓的“未定义”行为。使“未定义”行为未定义的原因是 C 标准没有指定它,因此允许在 C 实现或不同情况之间有所不同。这是它的关键特征,它是未指定的,是允许变化的,而不是说它是不可预测的。
评论
malloc()
malloc()
free()
free()
malloc()