2017-08-15 82 views
-1

我遇到了尝试将结构指针传递给将指针设置为指向多维数组的特定行的函数的问题。将结构指针传递给C中的函数以解引用数组

这是结构的声明:

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,然后解除引用partitionInfo后,我没有得到所需的结果 - 即ASSERT失败。

+1

断言* *内部功能不成?你确定'counter'是'S25FL032P'或'SST26VF032B'?然而,你还有另外一个问题:你只是分配给函数内的指针的本地副本,这对调用者传入的指针没有任何影响...... – aschepler

+0

_calling readPartitionTable,然后解除引用partitionInfo之后_你的意思是事后来自功能或断言功能失败? –

+0

@aschepler:为什么“*'counter' *”?交换机的参数是'installedFlashDevice'。 – alk

回答

2

调用readPartitionTable时,和然后提领partitionInfo 后来,我没有得到所需要的结果 - 即ASSERT 调用readPartitionTable失败后

如果你解引用partitionInfo,这是你的功能之外,所以它不是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); 
+0

这是我正在寻找的确切答案。谢谢! – makepeace

+0

它会介意,如果@PeterJ没有instadownvoted所有我的答案,因为我告诉他,他不应该占位符。我们应该删除这些评论。 –

+0

@makepeace很高兴能帮到你。如果您觉得它有用,请随时[接受此答案](https://stackoverflow.com/help/accepted-answer)。 – dbush