free():无效的指针以及如何重用当前释放的指针

时间:2020-05-06 11:00:00

标签: c free

我想将指针指向另一个对象并释放先前对象的内存。这是我所做的,但是我有一个无效的指针错误。正确的方法是什么?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int number = 5;
    int number2 = 10;

    // Give memory manually 
    int *pointer2number = (int *) malloc(sizeof(int));
    pointer2number = &number;

    printf("Number is %i\n", number);       
    printf("Address of number is %p\n", pointer2number);

    // Free memory 
    free(pointer2number);
    pointer2number = (int *) malloc(sizeof(int));
    pointer2number = &number2;
    printf("New number is %i\n", *pointer2number);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

int *pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number;

您将number的地址分配给指针pointer2number,并用其替换之前存储在pointer2number中的已分配动态内存的地址。

使用number2的第二次尝试也是如此。

任何尝试free()先前未由内存管理功能分配的内存都会导致未定义的行为:

free函数使ptr指向的空间被释放,即可以进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数执行与内存管理函数先前返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义

来源:ISO / IEC 9899:2018(C18),第7.22.3.3/2节

还有一个副作用,就是先前分配的动态内存也没有free()

过度考虑程序的逻辑!