c - 发送指向外部函数的指针使其为空后,它不会变为空

标签 c pointers struct null free

<分区>

我创建了一个“Vector”类型的指针(见代码)。创建后,我想将一个 Vector 类型的指针(意思是 Vector*)发送到一个名为“VectorDestroy(Vector* _vector)”的函数,该函数从内存中释放该结构并将其分配给 null。但是,当我继续编写代码并想要测试返回的 vector 是否为 null 失败;意味着它没有更改为 null

这是结构:

struct vector
{
    int* m_items;
    size_t m_originalSize; /*original allocated space for items*/
    size_t m_size; /*actual allocated space for items*/
    size_t m_nItems; /*actual number of items*/
    size_t m_blockSize; /*the chunk size to be allocated when no space available*/
    int m_magicNumber;

};

typedef struct vector Vector;

这是模块 1 中的外部函数 VectorDestroy:

void VectorDestroy(Vector* _vector)
{   
    if(_vector == NULL || _vector->m_magicNumber != MAGIC_NUMBER)
    {
        return;
    }

    _vector->m_magicNumber = 0Xdeadbeef;
    free(_vector->m_items);
    _vector->m_items = NULL;
    free(_vector);
    _vector = NULL;
}

这是模块 2 中的测试函数:

int VectorDestroyFunctional()
{
    Vector* vector = VectorCreate(5, 5);

    if(vector == NULL)
    {
        PrintResult(FAIL);
        return FAIL;
    }

    VectorDestroy(vector);

    if(vector == NULL)
    {
        PrintResult(PASS);
        return PASS;
    }

    PrintResult(FAIL);
    return FAIL;
}

在 VectorDestroy 中的 free() 函数并将指针分配给 null 之后,我希望指针为 null 并且测试会通过,但是在调试中我发现指针没有设置为 null 并且测试失败。 我错过了什么吗?

最佳答案

您取消了指针的本地副本。要使调用代码中的指针无效,您需要将指针传递给指向函数的指针:

void VectorDestroy(Vector **p_vector)
{   
    if (p_vector == NULL || *p_vector == NULL)
        return;
    Vector *vector = *p_vector;
    if (vector->m_magicNumber != MAGIC_NUMBER)
        return;

    vector->m_magicNumber = 0Xdeadbeef;
    free(vector->m_items);
    vector->m_items = NULL;
    free(vector);
    *p_vector = NULL;
}

然后你会调用:

VectorDestroy(&vector);

关于c - 发送指向外部函数的指针使其为空后,它不会变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55660258/

相关文章:

c - 我试图理解的字符串指针行为

连接四-评价比较-c

c++ - 使用 C++ 以编程方式将新盘符分配给现有驱动器

c - QSorting a malloc'd array of structures?

c - 如何从 C 文件中的双引号中读取多个单词

c - C中结构中的字符串数组

c - 如何在我的程序中检测到 stdout 已关闭(当 telnet session 关闭时)?

c++ - 指向存储在 map 容器中的数据的指针

c 读取字符串输入错误

c++ - #include <string> 在 header 中定义了一些结构。错误 : string does not define a type