1

在 C 中声明结构时,说:

typedef struct my_stuct {
 int x;
 float f;
} STRT;

如果我们想创建这个结构的一个实例并使用它,我们需要显式调用 malloc,获取一个指向这个结构的内存位置的指针,然后才能实际初始化/使用结构的任何成员:

STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));

但是,如果我声明一个原始数据类型(比如“int a;”)然后想要对其进行初始化(或对其执行任何其他操作),我不需要在执行任何操作之前通过调用 malloc 显式为其分配内存空间对其进行操作:

// we do not need to do a malloc(sizeof(i)) blah blah here. Why?
i = 10;

你能解释一下这种不一致的原因是什么吗?谢谢!

4

5 回答 5

7

没有不一致。这两种方法中的每一种都可以与原语和 一起使用structs

  STRT s1 = {1, 2};
  int i1 = 1;

  STRT *s2 = (STRT *)malloc(sizeof(STRT));
  int *i2 = (int *)malloc(sizeof(int));
  ...
于 2013-01-04T18:49:20.057 回答
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

不知道这是否回答了你的问题。

于 2013-01-04T18:58:28.427 回答
2

你可以做:

int i;

或者

int *i = (int*) malloc(sizeof(int));

就像你可以做的一样

STRT my_struct_instance;

或者

STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));
于 2013-01-04T18:51:25.767 回答
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};
于 2013-01-04T18:52:10.063 回答
0
STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));

使用动态存储;

int a;

使用自动存储(我现在使用 C++ 名称,但在 C 中可能类似地调用它)。所以,这是两个完全不同的东西。int a;是本地的,在(在大多数实现中)堆栈上(尽管堆栈不是相关的实现细节);SRTR * [...]是动态的,在(在大多数实现中)堆上(尽管同样,堆不是相关的实现细节)。

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

于 2013-01-04T18:54:11.453 回答