【问题标题】:allocating memory for structure pointers为结构指针分配内存
【发布时间】:2019-09-23 16:28:56
【问题描述】:

为什么在声明结构指针的时候需要分配内存

struct A{
///
};
int main(void)
{
    struct A *var=(struct A*)malloc(sizeof(struct A));
//
//
}

但是当我们声明一个结构变量时,我们不需要分配任何内存?

struct A var;

【问题讨论】:

  • 一种或另一种方式,如果你想使用一个指向结构的指针,你需要它指向有效的东西。这可能是动态的(如您在第一个示例中所示),但它也可以很容易地是自动的(struct A var, *pvar = &var;)。一本好的 C 书籍和/或教程涵盖了指针使用、动态分配等。值得花时间阅读更多内容。

标签: c pointers structure


【解决方案1】:

你不一定必须在声明指针时分配内存(它可以指向任何现有的相同类型的对象),但是为了使用指针而不导致未定义的行为,它必须指向该类型的对象。由于指针在数据结构中被广泛使用,分配的对象往往是最常被指向的对象,这就是为什么看起来你必须分配内存的原因。

【讨论】:

    【解决方案2】:

    这适用于任何指针,而不仅仅是指向结构的指针。原因是,当您声明一个变量(类型为 int、char 或某个结构 A 的类型)时,您告诉编译器创建一个新变量/实例。因此,编译器会自动为该变量分配内存。但是,当您声明指向某个 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));
    

    【讨论】:

    • 这里的例子是 C++(缺少 structnew 运算符)。
    • int *A * 也会占用堆栈中的内存(禁止优化)。此外,您不应在 C++ 中使用 malloc
    【解决方案3】:
    • struct A var 在主内存的堆栈区域上声明了一个变量var,其内部结构与struct A 中声明的一样。

    • struct A * var 也在主内存的堆栈区域声明了一个变量var,但是var 现在是一个指针,你可能知道,C 中的指针用于存储变量的地址,所以var需要知道地址是什么,声明(struct A*)malloc(sizeof(struct A));给你地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2017-01-03
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多