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

时间:2018-12-05 10:22:13

标签: c

我得到了一个.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 个答案:

答案 0 :(得分: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);