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

问题描述 投票:0回答:1
#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);

然后会发生什么。

  1. 既然我们不能通过给出指针来检索堆中数组的大小,那么这意味着 pc 不知道与 ptr 一起保留了多少字节,那么为什么它不从前一个数组的中间开始分配另一个堆内存。

我正在学习指针并有这个疑问。

c pointers malloc dynamic-memory-allocation
1个回答
2
投票
  1. malloc
    /
    free
    例程的一部分包括存储元数据,例如内存块有多大
    free()
    。通常,此数据存储在
    malloc()
    返回的指针之前的字节处。阅读更多这里.

  2. 由于指针的增量值不是之前由

    malloc()
    calloc()
    realloc()
    返回的值,因此代码
    ptr++; free(ptr);
    其中
    ptr
    malloc()
    返回调用未定义的行为。
    free()
    可能会尝试访问簿记数据,这些数据被假定为距分配块开始处的固定偏移量,但发现垃圾反而会剧烈崩溃。或者也许会发生完全不同的事情。您无法可靠地预测调用未定义行为时会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.