好的,这段代码没有实现你想要的功能:
struct some_struct *test_struct = malloc(sizeof(some_string);
test_struct->x = 2;
test_struct->y = 3;
test_struct->some_string = "sadlfkajsdflk";
在这种情况下,你的
*test_struct
现在指向一个具有
some_string
大小的'memory zone'(我认为你的some_string是
char*
)。
Malloc(X)
从程序(或进程)虚拟内存中给你分配了
X
的空间。
当你执行:
struct some_struct *test_struct
您有足够的空间来存储指向 some_struct
的指针。
如果您执行以下操作:
malloc(sizeof(struct some_struct));
您现在已经从虚拟内存中保留了struct some_struct
的空间。但是您想知道这个内存的“位置”。这就是为什么您将其分配给指针的原因:
test_struct = malloc (sizeof(struct some_struct));
[编辑]我会这样写:“为了让编译器更加愉快,你还应该在其中包含一个转换,告诉编译器malloc分配的空间将用于存储
struct some_struct
:”,并在之后给出一个示例。但实际上,这是不正确的。正如您在下面的评论中所看到的,@chutsu进行了更正,并且为了让自己相信,请查看
question。
主要原因是你冒很大的风险,而没有任何好处。
代码的其余部分现已更正:无需转换。
更清晰的方法是对结构体进行typedef。然后,您的代码将如下所示:
typedef struct some_struct {
int x;
int y;
char *some_string;
}SomeStruct;
SomeStruct *test_struct;
test_struct = malloc(sizeof(SomeStruct));
关于字符串分配。你可以这样想:使用malloc(以及它的兄弟函数calloc,realloc等)创建的所有内容都需要释放!这是因为所有其他变量都是函数本地变量,即使主函数也是一个函数,在函数终止时会被清除。
因此,在分配结构体后,如果您想要为字符串腾出空间,您必须为其分配空间。
test_struct->some_string = malloc((YOUR_STRING_SIZE+SPACE_FOR_THE_STRING_TERMINATOR)*sizeof(char))
使用 - SPACE_FOR_THE_STRING_TERMINATOR=1
,即\0
字符。
然后,如果你想释放test_struct
,你必须先释放字符串,然后再释放结构体,以相反的顺序。否则你会失去指向字符串的指针,导致内存泄漏。
具体如下:
free(test_struct->some_string);
free(test_struct);
就是这样,你完成了。
希望这有所帮助。
test_struct->some_string
指向一个字符串字面量,而不是指向内存(m|c|re)alloc
,因此在这种情况下不应该free
它。但如果您已经为test_struct->some_string
分配了内存(m|c|re)alloc
,则在free
test_struct
之前应该先free
它,否则会造成内存泄漏。 - Daniel Fischer