将结构指针传递给C中的函数以取消引用数组

时间:2017-08-15 12:03:34

标签: c function pointers

我在尝试将结构指针传递给一个函数时遇到问题,该函数将指针设置为指向多维数组的特定行。

这是结构的声明:

collection.insert({'part_project': 998,
                   'part_number': 002,
                   'part_category_prefix': 1,
                   'part_type': 110,
                   'part_description': 'Tier 2 Assembly B',
                   'part_revision': 1,
                   'part_version': 'A',
                   'bill_of_material_usages': [{
                       'bom_version': 'A',
                       'part_version': 'A',
                       'part_revision': 1,
                       'children': [
                           {'part_number': '998 1 3 100', 'quantity': 3},
                           {'part_number': '998 1 4 110', 'quantity': 1}
                       ]}]
                   })

这是功能:

typedef struct PartitionInfoStruct
{
   Partition definition;
   u16 start;
   u16 size;
   StringLiteral* desc;
} PartitionInfo;

这就是我的电话:

void readPartitionTable(Partition partition, PartitionInfo* partitionInfo)
{
   switch(installedFlashDevice)
   {
      case S25FL032P:
         partitionInfo = &PARTITION_TABLE_S25FL032P[partition];
         break;
      case SST26VF032B:
         partitionInfo = &PARTITION_TABLE_SST26VF032B[partition];
         break;
      default:
      //do nothing
         break;
   }   

   ASSERT(partitionInfo != NULL);     
}

出于某种原因,在调用 PartitionInfo* partitionInfo = NULL; readPartitionTable((Partition)counter, partitionInfo); ,然后再解除引用readPartitionTable之后,我没有得到所需的结果 - 即,ASSERT失败。

1 个答案:

答案 0 :(得分:2)

  

调用readPartitionTable时,然后取消引用partitionInfo   之后,我没有得到所需的结果 - 即ASSERT   失败

如果您在致电partitionInfo之后取消引用readPartitionTable,那么这不在您的职能范围之内,那么assert并非partitionInfo。失败了。

问题是您的函数正在更改参数的,即assert。赋值后,PartitionInfo **成功,但在函数外部看不到对局部变量或参数的更改。

然而,您可以做的是将指针作为参数并将取消引用。然后你可以读/写它指向的内容,即另一个函数中的变量。因此传入PartitionInfo *,即void readPartitionTable(Partition partition, PartitionInfo **partitionInfo) { switch(installedFlashDevice) { case S25FL032P: *partitionInfo = &PARTITION_TABLE_S25FL032P[partition]; break; case SST26VF032B: *partitionInfo = &PARTITION_TABLE_SST26VF032B[partition]; break; default: //do nothing break; } ASSERT(*partitionInfo != NULL); } 的地址来执行此操作:

 PartitionInfo* partitionInfo = NULL;
 readPartitionTable((Partition)counter, &partitionInfo);

然后你这样称呼它:

MAX