C 如何释放动态分配数组的所有字节?

How does C free all bytes of a dynamically allocated array?

提问人:Adi bhai 提问时间:4/12/2023 最后编辑:user16217248Adi bhai 更新时间:4/12/2023 访问量:125

问:

#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;
}
  1. 这如何释放所有 400 字节(在我的情况下)? 内存中只包含一个字节的地址,而且我没有传递任何其他参数来指定动态数组的大小,以便它可以运行循环并释放所有字节ptr

  2. 如果我这样做会发生什么:

    ptr++;
    free(ptr);
    
  3. 既然我们不能通过给出指针来检索堆中数组的大小,那么这意味着不知道保留了多少字节,那么为什么它不从前一个数组的中间开始分配另一个堆内存呢?malloc()ptr

C 指针 malloc 动态内存分配 免费

评论

1赞 Pepijn Kramer 4/12/2023
我删除了 C++,这是一个严格的 C 问题。C++ 和 C 是不同的语言。当 malloc 分配内存时,它分配的内存比您需要的要多一些。您的内存 + 一些标头数据,其中包含有关您分配的内存块的信息。假设信息需要 8 个字节,然后分配 408 个字节,您得到的指针将指向该内存中的第 8 个位置。然后,Free可以查找额外的数据并知道该怎么做 tharikasblogs.blogspot.com/p/)
0赞 Fe2O3 4/12/2023
想一想:如果代码在第二次调用时调用两次,函数如何知道已经分配了一定大小的块......有些阴谋诡计是双方都理解的。在程序代码级别,所需要的只是指向返回的相同指针(动态内存地址)(也不要越界!malloc()malloc()free()free()malloc()
0赞 hellork 4/12/2023
几个风格点。* 由于问题已移至仅 C 问题,因此不要强制转换 malloc() 的结果。stackoverflow.com/questions/605845/......* sizeof 运算符不是一个函数。它后面不需要括号。如果必须使用括号,(sizeof int) * 100 有效。

答:

5赞 user16217248 4/12/2023 #1
  1. / 例程的一部分包括存储元数据,例如内存块有多大。通常,此数据存储在 返回的指针之前的字节处。在此处阅读更多内容。mallocfreefree()malloc()

  2. 由于指针的递增值不是以前由 、 或 返回的值,因此 return by 的代码调用了未定义的行为。 可能会尝试访问假定与分配块开头的固定偏移量的簿记数据,但发现垃圾并剧烈崩溃。或者也许会发生完全不同的事情。您无法可靠地预测调用未定义行为时会发生什么。malloc()calloc()realloc()ptr++; free(ptr);ptrmalloc()free()

评论

3赞 Eric Postpischil 4/12/2023
@user16217248:在许多情况下,专家可以可靠地预测所谓的“未定义”行为。使“未定义”行为未定义的原因是 C 标准没有指定它,因此允许在 C 实现或不同情况之间有所不同。这是它的关键特征,它是未指定的,是允许变化的,而不是说它是不可预测的。