为结构指针分配内存
allocating memory for structure pointers
为什么声明结构体指针时需要分配内存
struct A{
///
};
int main(void)
{
struct A *var=(struct A*)malloc(sizeof(struct A));
//
//
}
但是当我们声明一个结构变量时,我们不需要分配任何内存?
struct A var;
这适用于任何指针,而不仅仅是指向结构的指针。原因是,当您声明一个变量(类型为 int、char 或某些结构 A 的类型)时,您告诉编译器创建一个新的 variable/instance。因此,编译器会自动为该变量分配内存。但是,当您声明指向某个 int 或某个 struct A 的指针时,您实际上是在告诉编译器您需要对某个变量的引用,而不是完全是该类型的新变量。为了说明这一点:
struct A{};
int a,b; // New variable a and b
struct A c,d; // New variables c,d of type struct A
// Now take a look at this:
int *px;
px = &a; // px referencing to a, no new int variable created;
px = &b; // px referencing to b, no new int variable created;
struct A* py;
py = &c; // py referencing to c, no new struct A variable created;
py = &d; // py referencing to d, no new struct A variable created;
现在,如果你只是声明一个指针 A* p,这里的 p 没有引用任何东西。所以,如果你想让 p 引用结构 A 的一个新实例,你必须明确地写:
c
p = (struct A*)malloc(sizeof(struct A));
struct A var
在主存的堆栈区域声明了一个变量 var
,其内部结构如 struct A
.
[=25 中声明的那样=]
struct A * var
还在主存的栈区声明了一个变量 var
但是 var
现在是一个指针,你可能知道,一个指针在C中用于存储变量的地址,因此var
需要知道地址是什么,声明(struct A*)malloc(sizeof(struct A));
给你地址。
您不一定必须在声明指针时分配内存(它可以指向相同类型的任何现有对象),但为了使用指针而不导致未定义的行为,它必须指向该类型的对象。由于指针在数据结构中被广泛使用,分配的对象往往是最常指向的对象,这就是为什么看起来你必须分配内存的原因。
为什么声明结构体指针时需要分配内存
struct A{
///
};
int main(void)
{
struct A *var=(struct A*)malloc(sizeof(struct A));
//
//
}
但是当我们声明一个结构变量时,我们不需要分配任何内存?
struct A var;
这适用于任何指针,而不仅仅是指向结构的指针。原因是,当您声明一个变量(类型为 int、char 或某些结构 A 的类型)时,您告诉编译器创建一个新的 variable/instance。因此,编译器会自动为该变量分配内存。但是,当您声明指向某个 int 或某个 struct A 的指针时,您实际上是在告诉编译器您需要对某个变量的引用,而不是完全是该类型的新变量。为了说明这一点:
struct A{};
int a,b; // New variable a and b
struct A c,d; // New variables c,d of type struct A
// Now take a look at this:
int *px;
px = &a; // px referencing to a, no new int variable created;
px = &b; // px referencing to b, no new int variable created;
struct A* py;
py = &c; // py referencing to c, no new struct A variable created;
py = &d; // py referencing to d, no new struct A variable created;
现在,如果你只是声明一个指针 A* p,这里的 p 没有引用任何东西。所以,如果你想让 p 引用结构 A 的一个新实例,你必须明确地写:
c
p = (struct A*)malloc(sizeof(struct A));
[=25 中声明的那样=]struct A var
在主存的堆栈区域声明了一个变量var
,其内部结构如struct A
.struct A * var
还在主存的栈区声明了一个变量var
但是var
现在是一个指针,你可能知道,一个指针在C中用于存储变量的地址,因此var
需要知道地址是什么,声明(struct A*)malloc(sizeof(struct A));
给你地址。
您不一定必须在声明指针时分配内存(它可以指向相同类型的任何现有对象),但为了使用指针而不导致未定义的行为,它必须指向该类型的对象。由于指针在数据结构中被广泛使用,分配的对象往往是最常指向的对象,这就是为什么看起来你必须分配内存的原因。