在堆上分配内存感到困惑吗?
如果我这样写来初始化堆内存中的变量
((struct node*)malloc(sizeof(struct node)).data=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;
}