我对此代码有疑问.我在我的框架中编写了这段代码,导致框架崩溃.但是当我在一个文件中重写下面的代码时,它的工作正常.我只是想知道,下面的代码是否正确的内存分配和释放它?(特别是对于msg-> context_var.type = f;的部分)谢谢
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int value;
int price;
int old;
} type_t;
typedef struct {
type_t *type;
} context_t;
typedef struct {
context_t context_var;
} send_request;
void send_Message(send_request *msg)
{
type_t *f = 0;
f = malloc(sizeof(f));
msg->context_var.type = f;
msg->context_var.type->price = 1;
msg->context_var.type->value = 100;
msg->context_var.type->old =120;
printf("value of %d/n", msg->context_var.type->price);
free(f);
}
int main()
{
send_request *msg = 0;
msg = (send_request *) malloc(sizeof(send_request));
send_Message(msg);
free(msg);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是不对的.
f = malloc(sizeof(f)); /* Wrong */
f = malloc(sizeof(*f)); /* Better ? */
Run Code Online (Sandbox Code Playgroud)
sizeof(f)会给你机器上指针的大小; sizeof(*f)会给你指向的对象的大小.
编辑按@Perception的要求
如果分配的数量少于所需,则会引发未定义的行为.任何事情都可能发生(甚至是期望的行为),这一切都取决于平台,环境(月相等).
msg->context_var.type->value = 100; /* Writes beyond what's allocated. */
Run Code Online (Sandbox Code Playgroud)
因此,根据"框架"的内存布局,这可能只是覆盖一些内存和"工作",或者它可能会崩溃.坦率地说,我喜欢它直接崩溃.