首页 > 解决方案 > 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;
}

标签: cfree

解决方案


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()也不是这样。

过度思考程序的逻辑!


推荐阅读