如何在结构指针中释放char指针的内存

时间:2019-09-19 02:17:18

标签: c pointers

我可以使用strdup分配值并使用以下命令打印值:(*test + index)->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)
}

3 个答案:

答案 0 :(得分:1)

如果我没记错的话,不是吗?

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

答案 1 :(得分: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 :(得分:0)

请阅读/理解:precedence of C operators

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

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

(*mystruct)+i = ...

等否则,+将在*

之前执行