导致框架崩溃的代码,但在单个文件中复制时,它起作用

sat*_*yam 0 c

我对此代码有疑问.我在我的框架中编写了这段代码,导致框架崩溃.但是当我在一个文件中重写下面的代码时,它的工作正常.我只是想知道,下面的代码是否正确的内存分配和释放它?(特别是对于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)

cni*_*tar 7

这是不对的.

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)

因此,根据"框架"的内存布局,这可能只是覆盖一些内存和"工作",或者它可能会崩溃.坦率地说,我喜欢它直接崩溃.