【问题标题】:making two struct pointers equal使两个结构指针相等
【发布时间】:2013-03-20 20:20:33
【问题描述】:

假设我有一个名为 A 的结构指针和一个名为 B 的结构指针:

struct example{
//variables and pointers
}*A 

然后我有一个数据类型结构示例的指针:

struct example *B=malloc(sizeof(struct example));

如果我愿意

A=B;

这个算术运算是否意味着无论结构指针 B 指向什么,结构指针 A 也指向什么?我用原始数据类型和指针得到它,但结构让我感到困惑,因为它们里面有变量..

假设结构指针 A 已设置,一切

【问题讨论】:

  • 这里有指点。所以A = B 使A 指向与B 相同的位置。如果您有struct example C; C = *B;,那么会将结构B 指向的成员复制到C 的成员中。

标签: c pointers struct


【解决方案1】:

是的,使用以下代码行,A 应该指向同一个位置,B 指向。

/* Define the struct example datatype */
struct example{
    //variables and pointers
};

/* Declare A and B as pointers to struct example */
struct example *A;
struct example *B;

/* Allocate memory equivalent to the size of struct example
   and store the address in B */
B=malloc(sizeof(struct example));

/* Copy the address in B to A, so that A points to the same
   location B was pointing to */
A = B;

您应该将指针视为另一个unsigned long 变量,它保存了一个内存地址(因为指针只是指向它所保存的地址)。

与任何其他变量一样,您可以将存储在一个指针变量中的地址复制到另一个。

【讨论】:

  • 一个问题。为什么我们必须为指针动态分配内存才能将其数据复制到其他指针?
【解决方案2】:

你所做的只是让 A 和 B 指向同一个结构。例如,假设您的 malloc() 在地址 0x1000 处为您的结构调用保留空间(只是一个示例)。

现在,在你的 malloc() 之后,B 只保存数字 0x1000。因此,当您执行 A = B 时,您也只是将 A 设置为 0x1000。这样 B->var1 与 A->var1 是完全相同的实体。

【讨论】:

    【解决方案3】:

    是的... A 和 B 是指针,而不是值。当您说 A = B 时,您是在说“将指针 A 设置为指向 B 所指向的同一事物”——或者更具体地说,A 和 B 在分配后都将包含相同的内存地址。

    当你使用 A->someVar 时你真正在做什么

    {someVar 的地址} = {结构的内存地址} + {someVar 相对于结构开始的字节偏移量}

    【讨论】:

      【解决方案4】:

      是的,如下代码:

      struct example* A;
      struct example* B;
      B = malloc(sizeof(struct example));
      A = B;
      

      将导致A 指向与B 相同的内存。但是请注意,更改指针本身的值 (B) 不会影响另一个指针 (A),例如,当您这样做时:

      free(B);
      B = NULL;
      

      指针A 仍将指向内存,struct example 的实例曾经驻留于此,因此A 将成为无效的(悬空)指针。

      【讨论】:

        【解决方案5】:

        指针将数据的地址保存在内存中,malloc 的调用返回您为数据分配的内存区域开始的第一个字的地址。

        你可以想象一个指针就像一张纸,你写下建筑物的号码,当你进入它时,你会发现公寓也有数字等等。

        因此,将指针的值分配给另一个指针就像拿另一张纸在上面写上第一张纸上的数字一样。

        struct 中的原始数据类型和/或其他指针就像公寓一样,它们可能会向您展示一些具体的东西,或者让您进入可以找到其他东西的其他区域。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-10
          • 1970-01-01
          • 2014-12-15
          • 1970-01-01
          相关资源
          最近更新 更多