2017-08-15 117 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