是否可以编写像这样的c malloc函数代码

时间:2019-12-19 11:57:23

标签: c++ c pointers malloc structure

在堆上分配内存感到困惑吗?

如果我这样写来初始化堆内存中的变量

((struct node*)malloc(sizeof(struct node)).data=2

我可以这样写而不是使用指针吗? 如果我声明节点类型变量,那么可以这样写还是不写? 如果我不通过访问直接地址使用指针。

2 个答案:

答案 0 :(得分:0)

问题的答案取决于您对“可能”的定义。

绝对可以编写和编译这样的代码,这将是正确的c程序,但是由于您从未存储过刚刚写入的数据的实际地址,因此它不会产生任何意义。没有办法在以后的程序中访问它。每次调用malloc函数时,它都会返回新分配的内存区域的新地址,因此,每次尝试像这样访问数据时,它将是具有不同地址的不同数据。

因此,如果要动态分配struct node并在程序中进一步使用它,则必须这样编写:

struct node* tmp = (struct node*)malloc(sizeof(struct node));
tmp->data = 2;

然后,您可以根据自己的需要使用tmp指针。

此外,当您不再需要此数据时,请不要忘记使用free对其进行分配。

答案 1 :(得分:0)

是的,当然可以:

#include <stdlib.h>

struct a
{
    int a; 
    float b;
};

void *foo()
{
    void *v;
    ((struct a *)malloc(sizeof(struct a))) -> b = 4.0f;
    (*((struct a *)malloc(sizeof(struct a)))).b = 6.0f;

    *((struct a *)malloc(sizeof(struct a)))  = (struct a){5, 8.0f};

    ((struct a *)(v = malloc(sizeof(struct a)))) -> b = 4.0f;

    return v;

}

https://godbolt.org/z/suW4sp