¿Puede determinar si una cadena es liberable en C? [duplicar

Esta pregunta ya tiene una respuesta aquí:

Compruebe si un puntero apunta a la memoria asignada en el montón 10 respuestas

Si yo digo

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

char *x;
char *y;

int main() {
        x = malloc(sizeof("Hello, world!"));
        strcpy(x, "Hello world!");
        y = "Hello, world";
        free(x);
        fprintf(stderr, "okay");
        free(y);
}

Entonces, obviamente, el programa imprimirá "ok" seguido de una muerte porque el "puntero que se está liberando no fue asignado", obviamente, porque la cadena era un literal de cadena.

Me gustaría escribir una función que no hace nada cuando se le dan literales de cadena, pero llama gratis cuando se le dan literales que no son de cadena. ¿Es eso posible y, de ser así, cómo?

Respuestas a la pregunta(5)

Su respuesta a la pregunta