发送指向外部函数的指针使其为空后,它不会变为空
After sending a pointer to an external function to make it null, it doesn't change to null
我创建了一个 "Vector" 类型的指针(见代码)。创建后,我想将一个 Vector 类型的指针(意思是 Vector*)发送到一个名为“VectorDestroy(Vector* _vector)”的函数,该函数从内存中释放该结构并将其分配给 null。但是,当我继续编写代码并想要测试返回的向量是否为 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 并且测试失败。
我错过了什么吗?
你说:
After the free() function in VectorDestroy and assigning the pointer to null I expected the pointer to be null and the test would pass, but in debugging I found out the pointer is not set to null and the test fails. Am I missing something?
是的。您忘记了在 C 中,参数始终是它们初始化时使用的变量的副本。因此,通过更改 _vector,您正在更改参数而不是外部变量。如果您希望函数能够更改外部指针,则声明应该类似于:
void VectorDestroy(Vector **vector_);
我冒昧把下划线移到了后面,因为你应该避免前导下划线。
您使指针的本地副本无效。要使调用代码中的指针无效,您需要将指针传递给指向函数的指针:
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);
我创建了一个 "Vector" 类型的指针(见代码)。创建后,我想将一个 Vector 类型的指针(意思是 Vector*)发送到一个名为“VectorDestroy(Vector* _vector)”的函数,该函数从内存中释放该结构并将其分配给 null。但是,当我继续编写代码并想要测试返回的向量是否为 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 并且测试失败。 我错过了什么吗?
你说:
After the free() function in VectorDestroy and assigning the pointer to null I expected the pointer to be null and the test would pass, but in debugging I found out the pointer is not set to null and the test fails. Am I missing something?
是的。您忘记了在 C 中,参数始终是它们初始化时使用的变量的副本。因此,通过更改 _vector,您正在更改参数而不是外部变量。如果您希望函数能够更改外部指针,则声明应该类似于:
void VectorDestroy(Vector **vector_);
我冒昧把下划线移到了后面,因为你应该避免前导下划线。
您使指针的本地副本无效。要使调用代码中的指针无效,您需要将指针传递给指向函数的指针:
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);