3

我已经做了很多环顾四周,但仍然无法理解它,假设我有结构:

struct some_struct {
    int x;
    int y;
    char *some_string;
};

假设我们有上面的结构,你将如何为上面的结构分配一些内存?一个人可以简单地做:

struct some_struct *test_struct;
test_struct = malloc(sizeof(struct some_struct));

但这足够了吗?你不需要分配一些内存some_string吗?或者如果结构包含更多指针,您是否也不需要为它们分配内存?

编辑:还有一件事......假设我的结构some_struct中已经有数据,例如

struct some_struct *test_struct = malloc(sizeof(some_string);
test_struct->x = 2;
test_struct->y = 3;
test_struct->some_string = "sadlfkajsdflk";

以下代码足以释放分配的内存吗?

free(test_struct);

还是我也必须进去释放 char* some_string ?

谢谢

4

4 回答 4

6

调用malloc(sizeof(struct some_struct));为您的结构提供内存,其中包括两个整数字段和一个指针字段的空间。

然而,指针字段在指向内存中的有效位置之前不能使用。为此,您需要将其指向一个有效的内存位置,例如为其分配内存malloc或将其指向一个预先存在的有效内存位置:

例如:

test_struct->some_string = malloc(100); // Allocate 100 bytes for the string
于 2012-12-27T18:35:10.687 回答
2

运行这两行代码后:

struct some_struct *test_struct;
test_struct = malloc(sizeof(struct some_struct));

您已经完成了足够的工作,可以开始使用test_struct. 指针的值只是一个内存地址,因此malloc分配了足够的两个ints 和一个char*。如果你想指向test_struct->some_string一个已经存在的char*,你可以这样做:

test_struct->some_string = some_other_char_pointer;

否则,您还需要为其分配内存:

test_struct->some_string = malloc(...);
于 2012-12-27T18:37:25.550 回答
1

您可能需要也可能不需要为字符串分配一些内存,具体取决于上下文。但是您提供的代码分配了保存该结构所需的所有内存。

基本上,编写代码来做你需要做的任何事情。字符串是否需要内存取决于您要做什么。

仅使用您显示的代码,您分配的指针并不指向任何特定的东西,就像您分配的整数不包含任何特定值一样。字符串的地址分配,如果需要,当您将 的值设置some_string为有用的东西时,可能同时设置xy为有用的东西。

于 2012-12-27T18:35:09.853 回答
1

好的,这段代码没有做你想做的事:

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);

就是这样,你完成了。

希望这可以帮助。

于 2012-12-27T22:40:40.953 回答