Как освободить память указателя на символ внутри указателя структуры - PullRequest
0 голосов
/ 19 сентября 2019

Я могу присвоить значения с помощью 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 ]

1 голос
/ 19 сентября 2019

Если я не ошибаюсь, не так ли?

free((*test+index)->email);
free(text+index);
0 голосов
/ 20 сентября 2019

Размещенный код не компилируется:

  • Вы не можете использовать struct в качестве имени переменной.struct - это ключевое слово.
  • Random - это глобальная переменная, а не тип.

В C идиоматично и намного проще вернуть результат вместо передачи егоaddress в качестве аргумента.

После этих замечаний и добавления базовых проверок код должен быть упрощен как:

#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();
    // ...
}

Этот код, семантически эквивалентный вашему опубликованному фрагменту, не имеет неопределенногоПоведение, где вы указываете, ваш реальный код должен делать что-то еще.

0 голосов
/ 20 сентября 2019

пожалуйста, прочитайте / поймите: приоритет операторов C

Затем обратите внимание, что оператор де-ссылки * имеет более низкий приоритет, чем оператор +,

Следовательно, опубликованный код необходимо изменить, чтобы использовать что-то вроде:

(*mystruct)+i = ...

и т. Д.В противном случае + будет выполнен до *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...