在C中分配内存混淆

时间:2012-12-27 18:32:26

标签: c memory struct malloc

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

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 个答案:

答案 0 :(得分:6)

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

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

e.g:

test_struct->some_string = malloc(100); // Allocate 100 bytes for the string

答案 1 :(得分:2)

运行这两行代码后:

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

您已经做得足以开始使用test_struct。指针的值只是一个内存地址,因此malloc可以为两个int和一个char*分配足够的值。如果您想将test_struct->some_string指向现有的char*,您可以这样做:

test_struct->some_string = some_other_char_pointer;

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

test_struct->some_string = malloc(...);

答案 2 :(得分:1)

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

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

只显示您显示的代码,您分配的指针不会指向任何特定的内容,就像您分配的整数不包含任何特定值一样。当您将some_string的值设置为有用的内容时,如果需要,可以在将xy设置为有用的内容时为字符串分配地址。

答案 3 :(得分: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现在指向类型为some_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纠正了这一点,并说服自己,检查这个question。 “主要”原因是你在做这件事时冒了很多风险,根本没有任何优势 现在更正了其余的代码:没有演员。

更简洁的方法就是输入结构。然后,您的代码将如下所示:

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

就是这样,你已经完成了。

希望这有帮助。