【问题标题】:Memory allocation for a structure pointer结构指针的内存分配
【发布时间】:2017-01-03 10:31:26
【问题描述】:

如果有如下结构:

struct student {
    int id;
    int marks;
} *S1,S2;

为什么需要分配内存给*S1 而不是S2?当 *S1 被声明为结构指针时,是否没有分配内存?只有当我们显式分配时才分配内存吗?

【问题讨论】:

  • 谁说需要什么?
  • 内存自动分配给 S1。正好有足够的内存来表示一个指针。你可以指向任何你喜欢的地方,即使是未分配的内存,它将是一个指向无效struct student的有效指针。
  • 为指针本身分配了内存,但在您分配student 并将指针分配到该内存的位置之前,如果未初始化,指针将指向垃圾。 S2 的分配方式与指针 S1 的分配方式相同;但一个是student,一个是指针。指针本身的内存和它所指向的内容是完全不同的东西。
  • @Tibrogargan - 这不是一个真正有效的指针......
  • 是的,内存仅在您明确分配时才分配给*S1。与S2 相反,struct 是实际的struct,而不是指针。

标签: c pointers


【解决方案1】:

在 C 中,每个变量都是一个内存位置。在您的示例中, S1 和 S2 都是变量,但是 S1 恰好是一个指针。指针是一个变量,其目的是为了保存内存位置的地址。

在您的示例中,S2 是struct student 类型的普通变量,指向大小为sizeof(struct student) 的内存位置。 S1 是一个指针变量,指向一个内存位置,其大小相当于一个指针变量的大小(32 位系统通常为 4 字节,64 位系统通常为 8 字节)。

就像您需要为普通变量赋值一样,您需要将内存位置的地址分配给一个指针,这就是您在分配内存并分配给它时所做的事情。

【讨论】:

  • 这是否意味着 S1 和 S2 在声明时占用了不同大小的内存?
【解决方案2】:

嗯,这就是语言的工作方式。它会自动为您要求的类型保留内存。如果您要求struct student,它会为struct student 保留内存。如果您要求 pointer,它会为 pointer 保留内存。

int 为例:

int n;  // Reserves memory for an int
int *p; // Reserves memory for a pointer (that points to an int)
        // but there is no memory allocated to hold the int
        // p needs to be initialized before you dereference it (i.e. *p)

p = malloc(sizeof(int));  // Initialize p and allocate memory to hold the int
if (!p) exit(1);          // Error - no memory available

*p = 5; // Now p can be used

free(p); // Release the memory

您的情况与上面的示例没有什么不同。 S2 是 struct student 而 S1 是指针(指向 struct student),您需要通过为 struct student 分配内存来初始化 S1。喜欢:

S1 = malloc(sizeof(struct student));

【讨论】:

    【解决方案3】:

    每个变量都与一些存储相关联(至少在 C 中)。所以它适用于S1S2。但是S1 是一个指针,因此需要存储指向结构的指针,S2 是一个结构,因此分配了完整结构的存储空间。不同之处在于S1 是间接的,意味着它的存储不包含结构,而是结构的地址,如果您希望它链接到结构,则需要为其提供适当的地址。要么:

    S1 = &S2;
    

    其中& 是取S2 地址的运算符。现在S1 是指向S2 的链接。或者:

    S1 = malloc(sizeof(struct student));
    

    malloc(动态)为结构分配存储空间并返回其地址(如果成功)。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多