在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
ingtest\u struct
之前free
它,否则你会泄漏内存。事实上,你没有在C中的malloc
前面加上石膏。看看我在这里写的一篇文章:我从那篇文档中得到的是,如果你忘了包括,你就不应该加石膏了?我通常使用cast,因为我知道我希望它假设我知道它正在返回该类型。不错的tumblr顺便说一句。不,它有点相反,你们不应该投,因为你们可能会忘记包括。诚然,这种联系的措辞很糟糕。但本质上,对于C编译器,如果您进行强制转换,编译器会假定您知道自己在做什么。问题是,如果您忘记了#包含,并且在malloc前面有一个cast,编译器不会告诉*您忘记了包含stdlib,而是会给您其他没有帮助的错误消息。看看这个:)啊!好啊事实上,这使