Присвоить ноль адресу указателя

Как я могу деинициализировать x внутри функции free_x? Я должен сделать это, чтобы соответствовать методу API. Я могу очень легко деинициализировать x, просто присвоив ему значение null, но я должен сделать это внутри функции free_x.

typedef struct
{
    int field1;
    void *field2;
}my_struct;

static my_struct var;

int main(void)
{
    void *x;

    alloc_x(&x);
    free_x(x); // x = NULL works but not allowed

    return 0;
}

void alloc_x(void **param)
{
    *param = (my_struct *)&var;
}

void free_x(void *param)
{
    // how can I free param here?
}

4 ответа

Решение

Простой ответ: ваш код уже завершен, так что не делайте больше.

Объяснение: Вы не выделяете память (в куче, в стеке или где-либо еще), поэтому освобождать нечего. Вы не вступаете во владение никакими ресурсами, которые должны быть возвращены, не устанавливаете какие-либо флаги, которые должны быть очищены, или увеличиваете любые семафоры, которые должны быть уменьшены, и т. Д.

Вы реализуете API, но только потому, что существует прототип функции, который не означает, что ваша реализация должна что-то делать, если в этом нет необходимости. Просто измените комментарий, чтобы объяснить, что делать нечего, и оставьте функцию пустой.

void alloc_x(void **param)
{
    *param = &var; // No need to cast here, just assign.
}

void free_x(void *param)
{
    // Nothing allocated, taken, incremented, etc. in alloc_x, so ...
    // nothing to free, release, decrement, etc. here in free_x.
}

Код, который использует API, ожидает память за param или же x указатель, который должен быть освобожден после вызова, так что он не должен ничего делать со своей переменной после этого в любом случае. Это не твоя проблема, если они это сделают, но это будет твоя проблема, если ты обойдёшься с абонентом x переменная!

Просто пиши *param = NULL;

malloc возвращает void *, а free принимает void *, поэтому некоторые ваши приведения бессмысленны, и вы всегда освобождаете void *, даже если начинаете с какого-либо другого указателя.

Я не думаю, что это возможно без изменения функции alloc_x. Одна из возможных реализаций приведена ниже:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    int field1;
    void *field2;
}my_struct;

static my_struct var;

void alloc_x(void **param)
{
    *param = malloc(sizeof(my_struct *));
    memcpy(*param,(my_struct *)&var,sizeof(my_struct *));
}

void free_x(void *param)
{
    free(param);
    // how can I free param here?
}
int main(void)
{
    void *x;

    alloc_x(&x);
    free_x(x); // x = NULL works but not allowed

    return 0;
}

Немного странно, но вы можете сделать

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

typedef struct
{
    int field1;
    void *field2;
}my_struct;

static my_struct var;

void alloc_x(void **param)
{
    *param = (my_struct *)&var;
}

void free_x(void *param)
{
    memset(param, 0x00, sizeof(void *));
}

int main(void)
{
    void *x;

    alloc_x(&x);
    printf("Before: x=%p\n", x);
    free_x(&x);
    printf("After: x=%p\n", x);

    return 0;
}

или же

void free_x(void *param)
{
    my_struct **p = param;

    *p = NULL;
}

Очевидно, это действительно только в случае использования void *

Другие вопросы по тегам