在C语言中通过取消对双指针的引用来释放指针[已关闭]

eh57zj3b  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(166)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
22天前关闭。
Improve this question
我试图写一个函数,通过发送字符串的地址(char*)到函数来释放动态分配的字符串。(发送char**)
我试过这样做:

void dstring_delete(DString* stringToDelete)
{
    // Precondition: stringToDelete is not NULL

    assert(stringToDelete != NULL);

    free(*stringToDelete);

其中DString的定义如下:

typedef char* DString;

对函数的调用如下所示:

dstring_delete(&str1);

其中str1的类型为DString:

DString str1, str2;

我看不出哪里出了问题,但是函数调用下面的Assert失败了:

assert(str1 == NULL);

因此,我的问题是如何在此示例中正确地释放内存。
我已经尝试了发送到free函数的不同参数,也试图在这里找到相同的问题。

ldfqzlk8

ldfqzlk81#

我假设str1指向一个要释放的已分配块,释放该块的代码序列如下所示:

dstring_delete(&str1);
    assert(str1 == NULL);

OP对dstring_delete的实现似乎如下所示,但OP没有发布包括右大括号在内的完整函数定义:

void dstring_delete(DString* stringToDelete)
{
    // Precondition: stringToDelete is not NULL

    assert(stringToDelete != NULL);

    free(*stringToDelete);
}

OP的问题不是很清楚,但我认为他们的代码包含以下序列,str1指向一个先前分配的要释放的块:

dstring_delete(&str1);
    assert(str1 == NULL);

OP写入assert(str1 == NULL);失败。这是因为dstring_delete不更改*stringToDelete的值(它将str1变量作为别名),因此*stringToDelete(和str1变量)在从函数返回时仍将包含非空值。但是,assert(str1 == NULL);意味着它期望dstring_delete将指针值设置为NULL。通过在释放分配的块之后更改dstring_delete的函数体以将指针设置为NULL,可以很容易地解决这个问题:

void dstring_delete(DString* stringToDelete)
{
    // Precondition: stringToDelete is not NULL

    assert(stringToDelete != NULL);

    free(*stringToDelete);

    *stringToDelete = NULL;
}

现在,在函数调用dstring_delete(&str1);之后,str1将变为NULL,因此assert(str1 == NULL);调用将通过。

nimxete2

nimxete22#

字符串的变量名本身就是对该字符串的内存引用;类型是字符指针,所以变量包含一个指针,指针是一个内存地址。2所以当你调用free()的时候,你只需要传递变量的名字。
(If您使用“&”传递字符串的内存地址所在的内存地址,并且您只需要后者。)

相关问题