Могу ли я проверить, был ли указатель выделен malloc/calloc/realloc?

Мне было интересно, можно ли проверить, был ли указатель, переданный в функцию, назначаться malloc/calloc/realloc?

int main(){
    struct something o;
    struct something *a;
    a = malloc(sizeof(struct something));
    freeSome(&o);/*This would normally throw an (corruption?) error*/
    freeSome(a);/*This is fine*/
}

void freeSome(struct something * t){
    if (/*expression here*/){
        free(t);
    }
}

Я понимаю, что обычно вы проверяете, есть ли t == NULL, но мне просто интересно, можно ли увидеть, была ли выделена память для данного указателя.

Ответ 1

Нет, вы не можете.

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

Необработанные указатели в C не могут передавать дополнительную информацию о памяти, на которую они указывают. Если вы хотите получить такую ​​информацию, вам придется передать дополнительную оболочку, содержащую интересующий вас указатель, например:

typedef struct my_pointer
{
   void  *ptr;
   int   is_dynamically_allocated;
}  ptr;

Но это будет огромная потеря памяти/времени.

Ответ 2

Невозможно проверить, вы должны NULL инициализировать, а затем проверить, действительно ли NULL

Из раздела 7.20.3.2 Свободная функция стандарта C99:

Свободная функция вызывает освобождение пространства, на которое указывает ptr, то есть,      доступный для дальнейшего распределения. Если ptr нулевой указатель, никаких действий не происходит. В противном случае, если аргумент не сопоставить указатель, ранее возвращенный calloc, malloc или realloc функции, или если пространство было освобождено путем вызова бесплатного или realloc, поведение undefined.