最近做一個工具,在整改函數時需要給一個全局變量指派
RadixNode *g_pstRootBase
指派的來源為已定義的結構體:TreeSet treeSet = {0}中的trSet->tNameSet[i].tName位址(其中i為變量。
以下是trSet結構體的定義:
typedef struct tagTreeName
{
RadixNode *tName;
char *fName;
}TreeName;
typedef struct tagTreeSet
TreeName tNameSet[MAX_SYMBOL_TREE_NUM];
int realNum;
}TreeSet;
因為其他處理的需要,寫了個函數,函數原型為:
int setTreeName(TreeSet *trSet, RadixNode **tName)
想通過第二個入參tName将trSet->tNameSet[i].tName的位址指派給g_pstRootBase(函數有删減)
傳參方式為:setTreeName(&trSet, &g_pstRootBase),内部處理如下
tName = &trSet->tNameSet[i].tName;
}
}
但在調試的時候發現g_pstRootBase并沒有指派成功,即g_pstRootBase仍然是初始值
分析一下才發現&g_pstRootBase的意思是的g_pstRootBase位址,并不是一個真正的指針變量,可以認為就是一個位址常數!
修改函數中對g_pstRootBase的指派方式如下:
*tName = (RadixNode*)(&trSet->tNameSet[i].tName);
這樣程式就可以正常運作了,即将&trSet->tNameSet[i].tName的位址指派到位址*tName上
通過以上可以總結出:盡量少用引用作為左值,如果需要通過函數參數來指派(出參),最好使用臨時指針變量來擷取位址,再指派給需要的變量