如何通过调用malloc/calloc释放其元素已被单独分配内存的整个数组

如何通过调用malloc/calloc释放其元素已被单独分配内存的整个数组,c,memory-management,C,Memory Management,据我所知,malloc和calloc只是底层内存上的簿记API。记住这一点,我想知道对free()的调用是否会释放整个数组,这些数组的各个元素都是通过对malloc(或calloc)的独立调用分配内存的 确切地说, 我有以下代码: int *num,* num_start; num_start=num; for(i=0;i<N;i++) { num = (int *)calloc(0, sizeof(int)); num++; } free(num_start);

据我所知,malloc和calloc只是底层内存上的簿记API。记住这一点,我想知道对free()的调用是否会释放整个数组,这些数组的各个元素都是通过对malloc(或calloc)的独立调用分配内存的

确切地说, 我有以下代码:

int *num,* num_start;

num_start=num;

for(i=0;i<N;i++)
{
    num = (int *)calloc(0, sizeof(int));
    num++;
}

free(num_start);
int*num,*num\u开始;
num_start=num;
对于(i=0;i函数,
calloc()
malloc()
函数返回一个指向分配的指针,该指针兼作释放内存的句柄。当您可以自由复制该指针并根据需要操作它们时,当您调用
free()
时,必须提供原始值

也就是说,这确实有效:

// Original allocation
int* x = calloc(42, sizeof(int));

// Making a new (independent) copy of the pointer to a new pointer
int* p = x;

// Arbitrary pointer manipulation and mangling
x++;

// Freeing with the copied value
free(p);
只要你回到原来的目的地,你也可以有点冒险精神:

int* x = calloc(42, sizeof(int));

x += 40;
x -= 30;
x += 10;
x -= 13;
x -= 7;

free(x);
此处
x
经过一小段旅程后已恢复到其原始值。通常情况下,保留原始指针比以后重新构建它更好。如果您打算对其进行操作,请复制副本。

您发布的“代码”毫无意义,而且是错误的

int *num, num_start;
num_start=num;
num_start是一个整数,而不是指针

for(i=0;i<N;i++)
{
    num = (int *)calloc(0, sizeof(int));
    num++;
}
而要解放你只需要

free(num);
或者,若要分配指针以存储N个指针到N个整数

int **allocate(size_t N)
{
    int **num = malloc(N * sizeof(*num));
    for(size_t i=0; i<N; i++)
    {
        num[i] = calloc(N, sizeof(**num));
    }
    return num;
}

void arrayfree(int **num, size_t size)
{
    for(size_t i = 0; i < size; i++)
    {
        free(num[i]);
    }
    free(num);
}
int**allocate(大小)
{
int**num=malloc(N*sizeof(*num));

对于(sisixt i=0;在C++ 11中改变了它的变化,因此标签是多余的。实际上,C++是完全无关的,除非你谈论的是C++代码的特定行为,而C代码是我看不到的。注意:<代码> NUMYSTART/<代码>不是指针,尽管你可能会想。你也要求零长度分配,这似乎是错误的。te:num\u start在num被分配任何有意义的值之前被分配。您需要将每个
malloc()
与相应的
free()
配对。因此在您的代码中有
N
mallocs(在循环中),您需要
N
frees(在循环中)你能在没有警告的情况下编译这段代码吗?当你运行它时它会崩溃吗?使用asan如何?使用
sizeof
not中的对象types@P__J__这是一种我看到越来越流行的替代方法,但这是一种更传统的方法。就像空格和制表符一样。它是“传统的”多年来的教学方法。老师们一直认为int*x=malloc(sizeof(*x)),这很简单,老师们不教;@tadman:一个问题的答案不少于六年,一个支持对象的顶级答案的票数比领先的支持大小的答案多一个数量级(有一个支持意图的答案)这不是一场“生动”的辩论。@tadman:我从第一版开始学习C,但这并不意味着我就到此为止了。
int **allocate(size_t N)
{
    int **num = malloc(N * sizeof(*num));
    for(size_t i=0; i<N; i++)
    {
        num[i] = calloc(N, sizeof(**num));
    }
    return num;
}

void arrayfree(int **num, size_t size)
{
    for(size_t i = 0; i < size; i++)
    {
        free(num[i]);
    }
    free(num);
}