在我正在制作的程序中,我有一个像
这样的结构typedef struct _mystruct{
char* my_string;
} mystruct;
大多数时候my_string是使用malloc分配的,所以有一个调用
的函数free(mystructa->my_string);
通常这是有效的,但在某些时候,my_string被设置为文字
my_string = "This is a literal";
在我调用free()之前,有没有办法告诉两者之间的区别?
答案 0 :(得分: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;
2)始终使用strdup
动态分配。
mystructa.my_string = strdup("This is a literal");
free(mystructa.my_string);
这两种方法都涉及对现有代码的更改,但我认为解决方案2更加健壮,可靠且可维护。
答案 1 :(得分:-3)
动态内存和静态内存转到不同的地方:堆栈和堆
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
char aString[] = "this is a string";
printf("the string is located at %x \n", &aString);
char * pString = (char*) malloc(sizeof(char) * 64);
strcpy(pString, "this is a dynamic string");
printf("the pointer is located at %x \n", &pString);
printf("the dynamic string is located at %x \n\n", &*pString);
return 0;
}
/************* *** **************/
robert@debian:/tmp$ gcc test.c
robert@debian:/tmp$ ./a.out
the string is located at bfcdbe8f
the pointer is located at bfcdbe88
the dynamic string is located at 95a3008