指向指针数组与指向数组的指针

3
我收到了一个.o文件,它创建了一个box_t **,我需要使用它。现在,我不知道它是: 情况1:
指向box_t数组的指针或者
情况2:
指向box_t *数组的指针。
我自己编写了一个简单的代码,在两种方式下创建了box_t**并进行了不同的访问。在这两种情况下似乎都正常工作。现在,如果给定一个box_t **和大小为size_t n的元素数,是否有可能在没有进一步信息的情况下知道它是情况1还是情况2?
struct box_tag{
    int pencils;
    int pens;
};

typedef struct box_tag box_t;

box_t boxarray[10] = {{1,2},{3,4},
         {5,6},{7,8},
         {9,10},{11,12},
         {13,14},{15,16},
         {17,18},{19,20}};

box_t ** box_bundle;

版本1的创建:

box_t** create_dp(void)
{
  box_bundle = (box_t **)malloc(sizeof(box_t **));
  *box_bundle = boxarray;
}

访问版本 1:

int main ()
{
  box_t * tmp = *box_bundle;

  for (int i =0; i<10; i++)
    {
      printf("%d\n",tmp[i].pencils);
    }

  return 0;
}

创作版本 2:

box_t** create_dp (void)
{
  box_bundle = (box_t **)malloc(sizeof(box_t **));
  *box_bundle = (box_t *)malloc (sizeof(box_t *) * 10);

  for(int i=0; i<10;i++)
    {
      *(box_bundle +i )  = &boxarray[i];
    }
}

访问版本2:

int main ()
{
  create_dp();

  for(int i=0; i<10; i++)
    {
      box_t * tmp =*box_bundle++;
      printf("pencils %d \n", tmp->pencils);
    }

  return 0;
}
1个回答

1
两种情况都是错误的。您不能使用 box_t** 指向任何数组,也不能指向类型为 box_t boxarray[10] 的数组,因为它们是不兼容的类型。您的代码中没有必要在任何地方使用多级间接性。
但是您可以使用 box_t* 指向数组中的第一个元素,这就是您的代码在这里执行的操作:*box_bundle = boxarray;。但这是一种混淆的方式。
正确的代码应该是:box_t* box_bundle;。如果它应该指向原始数组,则不需要 malloc。如果它应该保存原始数组的副本,则需要分配和复制数据:
box_t* box_bundle = malloc (sizeof(*box_bundle)*10);
memcpy(box_bundle, boxarray, sizeof boxarray);

我的主要问题是,给定一个box_t **和大小为size_t n的元素数量,我应该如何访问它? - RRON
@sniper 正如答案所述,“您不能使用box_t**指向任何数组”。但是,您可以使用它来模拟2D数组,但这也不是本例的情况。只需忘记所有关于box_t **的内容,它是针对不同问题的错误工具。 - Lundin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接