在C中声明一个结构时,请说:
typedef struct my_stuct {
int x;
float f;
} STRT;
如果我们想要创建这个结构的实例并使用它,我们显然需要调用malloc,在我们实际初始化/使用结构的任何成员之前,获取一个指向此结构的内存位置的指针: / p>
STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));
但是,如果我声明一个原始数据类型(比如“int a;”),然后想要初始化它(或对它做任何其他操作),我不需要通过调用malloc为它显式分配mempory空间在对它进行任何操作之前:
// we do not need to do a malloc(sizeof(i)) blah blah here. Why?
i = 10;
请您解释一下这种不一致的原因是什么?谢谢!
答案 0 :(得分:7)
没有不一致。这两种方法中的每一种都可以用于基元和structs
:
STRT s1 = {1, 2};
int i1 = 1;
STRT *s2 = (STRT *)malloc(sizeof(STRT));
int *i2 = (int *)malloc(sizeof(int));
...
答案 1 :(得分:2)
你可以这样做:
int i;
或
int *i = (int*) malloc(sizeof(int));
就像你可以做的那样
STRT my_struct_instance;
或
STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));
答案 2 :(得分:2)
在malloc示例中,您正在使用指针。你所说的不一致是因为指针可以用几种方式初始化。它并不总是由新的内存分配初始化,但也可以初始化为指向现有的内存块。因此,语言不可能假设变量应该在堆上分配:
STRT* my_struct_instance; // here I assume (incorrectly) that it is automatically allocated on the heap
my_struct_instance->x = 0; // ERROR: uninitialized use of that variable
不知道是否能回答你的问题。
答案 3 :(得分:1)
你可以用两种方式做到,没有任何不一致。
堆
int* a= malloc(sizeof(int));
*a=10;
STRT* b= malloc(sizeof(STRT));
b->x=1;
b->f=1.0;
堆叠
int a=10;
STRT b= {1, 1.0};
答案 4 :(得分:0)
STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));
使用动态存储;
int a;
使用自动存储(我现在正在使用C ++名称,但可能在C中使用类似名称)。所以,这是两件完全不同的事情。 int a;
是本地的,在(在大多数实现中)堆栈(尽管堆栈不是相关的实现细节); SRTR * [...]
是动态的(在大多数实现中)堆(尽管堆也不是相关的实现细节)。
所以,没有不一致。说有一个就像是说苹果和橘子之间存在不一致 - 但当然有,因为你要比较苹果和橘子。 (问题的其他部分没有意义,因为它们基于苹果和橙子是同一个事物的假设。)