堆栈与原始数据类型的内存分配

时间:2013-01-04 18:46:32

标签: c memory-management malloc

在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;

请您解释一下这种不一致的原因是什么?谢谢!

5 个答案:

答案 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 * [...]是动态的(在大多数实现中)堆(尽管堆也不是相关的实现细节)。

所以,没有不一致。说有一个就像是说苹果和橘子之间存在不一致 - 但当然有,因为你要比较苹果和橘子。 (问题的其他部分没有意义,因为它们基于苹果和橙子是同一个事物的假设。)