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