好的,这段代码没有做你想做的事:
struct some_struct *test_struct = malloc(sizeof(some_string);
test_struct->x = 2;
test_struct->y = 3;
test_struct->some_string = "sadlfkajsdflk";
在这种情况下,您*test_struct
现在指向一个具有 typeofsome_sring
大小的“内存区”(我认为您的 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 纠正了这一点,为了说服自己,请检查这个问题。“主要原因”是你冒着很大的风险去做这件事,根本没有任何好处。
其余代码现已更正:无演员表。
一种更简洁的方法是对结构进行类型定义。然后,您的代码将如下所示:
typedef struct some_struct {
int x;
int y;
char *some_string;
}SomeStruct;
SomeStruct *test_struct;
test_struct = malloc(sizeof(SomeStruct));
关于字符串分配。你可以这样想:用 malloc(及其兄弟 calloc、realloc...)创建的所有东西都需要释放!发生这种情况是因为所有其他变量都是函数的局部变量,即使 main 也是一个函数,并且这些变量在函数终止时被清除。
因此,在分配结构之后,如果您想要为字符串分配空间,则必须为其分配空间。
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);
就是这样,你完成了。
希望这可以帮助。