在C语言中分配内存混乱

在C语言中分配内存混乱,c,memory,struct,malloc,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)); 但这足够了吗?您不需要为一些字符串分配一些内存吗?或者

我已经环顾了很多地方,但仍然无法理解,假设我有一个结构:

struct some_struct {
    int x;
    int y;
    char *some_string;
};
假设我们有上面的结构,您将如何为上面的结构分配一些内存? 我们可以简单地做到:

struct some_struct *test_struct;
test_struct = malloc(sizeof(struct 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_字符串吗


谢谢

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

基本上,编写可以执行您需要执行的任何操作的代码。字符串是否需要内存取决于要执行的操作

仅使用显示的代码,分配的指针不会指向任何特定的值,就像分配的整数不包含任何特定的值一样。如果需要,当您将
some_string
的值设置为有用的值时,可能同时将
x
y
设置为有用的值。

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

但是,指针字段必须指向内存中的有效位置才能使用。为此,您需要将其指向有效的内存位置,例如使用
malloc
为其分配内存或将其指向预先存在的有效内存位置:

e、 g:


运行这两行代码后:

struct some_struct *test_struct;
test_struct = malloc(sizeof(struct some_struct));
您已经做了足够多的工作来开始使用
test\u struct
。指针的值只是一个内存地址,因此
malloc
为两个
int
s和一个
char*
分配足够的内存。如果您想将
test\u struct->一些字符串
指向已经存在的
char*
,您可以这样做:

test_struct->some_string = some_other_char_pointer;
否则,您还需要为其分配内存:

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

好的,这段代码不是您想要的:

struct some_struct *test_struct = malloc(sizeof(some_string);
test_struct->x = 2;
test_struct->y = 3;
test_struct->some_string = "sadlfkajsdflk";
在本例中,您的
*test\u结构现在指向类型为
some\u sring
size的“内存区域”(我认为您的some\u字符串是
char*

Malloc(X)
为您的程序(或进程)虚拟内存提供
X
空间。 当您这样做时:

struct some_struct *test_struct; 
您可以获得足够的空间来存储指向某个结构的指针

如果您这样做:

malloc(sizeof(struct some_struct));
您现在已经从虚拟内存中保留了一些_struct
空间。但是你想知道记忆在哪里。这就是为什么要将其指定给指针:

test_struct = malloc (sizeof(struct some_struct));
[编辑]我会这样写:“为了让你的编译器更快乐,你还应该在其中包含一个cast,告诉编译器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));
free(test_struct->some_string);
free(test_struct);
关于字符串分配。你可以这样想:用malloc(及其兄弟calloc,realloc…)创建的所有东西都需要免费! 这是因为所有其他变量都是函数的局部变量,即使main是函数,当函数终止时,这些变量也会被清除

因此,在分配完struct之后,如果想要为字符串分配空间,就必须为它分配空间

test_struct->some_string = malloc((YOUR_STRING_SIZE+SPACE_FOR_THE_STRING_TERMINATOR)*sizeof(char));
字符串终止符=1时使用-
空格,\u
\0
字符

然后,如果要释放
test\u struct
,则必须先释放字符串,然后再释放结构,按相反顺序,将丢失指向字符串的指针,这将导致泄漏。 看起来是这样的:

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

SomeStruct *test_struct;
test_struct = malloc(sizeof(SomeStruct));
free(test_struct->some_string);
free(test_struct);
就这样,你完了


希望这有帮助。

您好,我想知道您是否可以对我新编辑的问题发表意见,谢谢:)@chutsu,您使用
malloc
分配的任何内容都必须使用
free()
免费。因此,如果您使用
malloc
test\u struct->某些字符串分配内存,那么您也必须使用
free
释放内存。但在示例代码中,您只需将
test\u-struct
设置为字符串文字,这意味着您不需要释放它。关于编辑,您让
test\u-struct->some\u-string
指向字符串文字,而不是指向内存
(m | c | re)alloc
ed,因此在这种情况下,您不应该
释放它。但是如果您有
(m | c | re)将内存分配给
测试结构->一些字符串
,你应该在
free
ing
test\u struct
之前
free
它,否则你会泄漏内存。事实上,你没有在C中的
malloc
前面加上石膏。看看我在这里写的一篇文章:我从那篇文档中得到的是,如果你忘了包括,你就不应该加石膏了?我通常使用cast,因为我知道我希望它假设我知道它正在返回该类型。不错的tumblr顺便说一句。不,它有点相反,你们不应该投,因为你们可能会忘记包括。诚然,这种联系的措辞很糟糕。但本质上,对于C编译器,如果您进行强制转换,编译器会假定您知道自己在做什么。问题是,如果您忘记了
#包含
,并且在malloc前面有一个cast,编译器不会告诉*您忘记了包含stdlib,而是会给您其他没有帮助的错误消息。看看这个:)啊!好啊事实上,这使