【问题标题】:How to free memory of a char pointer inside a struct pointer如何释放结构指针内的字符指针的内存
【发布时间】:2019-09-19 02:17:18
【问题描述】:

我可以使用 strdup 分配值并使用以下命令打印值:(*test + index)->email 但我不知道如何释放分配给变量 email 的内存。我想过释放test+index,但我想这会导致内存泄漏,对吧?考虑到结构已分配内存,并且其中的每个指针都分配有strdup 的内存。

编辑:

代码大致是这样的:

struct random {
    char *email;
} Random;

void function(Random **struct) {
    char *temp = calloc(100, sizeof(char));
    *struct = calloc(5, sizeof(Random));
    for (int i = 0; i < 5; i++) {
        scanf("%s", temp);
        (*struct + i)->email = strdup(temp); //This works
    }
    free((*struct + 3)->email); //Gives segmentation fault
}

int main() {
    Random *struct;

    function(&struct)
}

【问题讨论】:

  • 这里有没有省略代码?因为scanf 变为未初始化的temp 将是未定义的行为。 temp 需要是malloced,或者做成一个数组,而不仅仅是一个char*。另外,你在这里使用*struct + i,这是没有意义的,因为没有i变量,也没有randomSize变量。
  • @ShadowRanger 是的,我尝试尽可能简化示例。我忘记了 malloc 部分。 temp 用 calloc 初始化。
  • 你为什么要加i?您将不得不输入足够的代码来重现问题
  • 您将需要提供一个实际 minimal reproducible example(确保它可以编译、运行并且与您的完整代码有相同的错误),我们可以'当你把代码砍得这么厉害时,不要只是猜测你还犯了什么错误。
  • C11 Standard - 6.4.1 Keywords,不允许使用struct 作为变量名。

标签: c pointers


【解决方案1】:

贴出的代码无法编译:

  • 您不能使用struct 作为变量名。 struct 是一个关键字。
  • Random 是全局变量,而不是类型。

在 C 中返回结果而不是将其地址作为参数传递是惯用且简单得多的。

根据这些说明,并添加基本检查,代码应简化为:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Random {
    char *email;
} Random;

Random *function(void) {
    char *temp = calloc(100, sizeof(char));
    if (temp == NULL)
        return NULL;
    Random *s = calloc(5, sizeof(Random));
    if (s != NULL) {
        for (int i = 0; i < 5; i++) {
            if (scanf("%99s", temp) != 1)
                *temp = '\0';
            (s + i)->email = strdup(temp); //This works
        }
        free((s + 3)->email); //Gives segmentation fault
    }
    free(temp);
    return s;
}

int main() {
    Random *s = function();
    // ...
}

此代码在语义上等同于您发布的片段,在您指出的地方没有未定义的行为,您的实际代码必须执行其他操作。

【讨论】:

    【解决方案2】:

    如果我没记错的话,会不会是这个?

    free(*(test+index)->email);
    free(text+index);
    

    【讨论】:

    • 我在尝试时遇到了分割错误。也许编辑可能会澄清一些事情?我不确定。
    • 我想应该是free((*(test + index))-&gt;email)。或者,更好的是free(test[index]-&gt;email); and free(text[index]);`.
    【解决方案3】:

    请阅读/理解:precedence of C operators

    然后请注意,取消引用运算符* 的优先级低于+ 运算符,

    因此,需要修改发布的代码以使用以下内容:

    (*mystruct)+i = ...
    

    等等。否则,+ 将在* 之前执行

    【讨论】:

    • unary * 评估 before 二进制 +,通常称为具有 更高 优先级,而不是更低。 *s + i 等价于(*s) + i,括号没有任何变化。
    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2022-09-27
    • 2021-08-07
    相关资源
    最近更新 更多