c语言 - 发送指向外部函数的指针使其为 null 后,它不会更改为 null



我创建了一个类型为"Vector"的指针(参见代码(。创建后,我想将 Vector(意思是 Vector*(类型的指针发送到一个名为"VectorDestroy(Vector* _vector("的函数,该函数将结构从内存中释放出来并将其分配给 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);

你说:

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

是的。您忘记了在 C 中,参数始终是初始化它们的变量的副本。因此,通过更改_vector您正在更改参数而不是外部变量。如果您希望函数能够更改外部指针,则声明应如下所示:

void VectorDestroy(Vector **vector_);

我冒昧地将下划线移到后面,因为您应该避免使用前导下划线。

相关内容

  • 没有找到相关文章

最新更新