在我正在研究的程序中,我有一个像

typedef struct _mystruct{
    char* my_string;
} mystruct;


大多数情况下,使用malloc分配my_string的时间,因此有一个函数会调用

free(mystructa->my_string);


通常这是可行的,但在某些时候,my_string设置为文字

my_string = "This is a literal";


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

最佳答案

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

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;


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

mystructa.my_string = strdup("This is a literal");
free(mystructa.my_string);


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

09-27 02:11