如何区分动态分配的char*和静态char*

Gra*_*eme 3 c arrays string free pointers

在我正在研究的程序中,我有一个类似的结构

typedef struct _mystruct{
    char* my_string;
} mystruct;
Run Code Online (Sandbox Code Playgroud)

大多数时候my_string是使用malloc分配的,所以有一个函数可以调用

free(mystructa->my_string);  
Run Code Online (Sandbox Code Playgroud)

通常这是有效的,但在某些时候,my_string被设置为文字

my_string = "This is a literal"; 
Run Code Online (Sandbox Code Playgroud)

在我调用free()之前有没有办法告诉两者之间的区别?

Car*_*ory 7

无法可靠地区分指向文字的指针和指向已分配内存的指针.您将不得不推出自己的解决方案.有两种方法可以解决这个问题:

1)在struct指示是否应该释放指针时设置一个标志.

typedef struct _mystruct {
    char *my_string;
    int string_was_allocated;
} mystruct;

mystructa.my_string = malloc(count);
mystructa.string_was_allocated = 1;
.
.
if (mystructa.string_was_allocated)
   free(mystructa.my_string);

mystructa.my_string = "This is a literal";
mystructa.string_was_allocated = 0;
Run Code Online (Sandbox Code Playgroud)

2)始终使用动态分配strdup.

mystructa.my_string = strdup("This is a literal");
free(mystructa.my_string);
Run Code Online (Sandbox Code Playgroud)

这两种方法都涉及对现有代码的更改,但我认为解决方案2更加健壮,可靠且可维护.