下面的函數將指針指向一個指向API_AddParType
結構體的指針數組,並列出每個數組元素的一些字段。當使用指針而不是引用時,得到segfault訪問數組的指針
void ParamsListWrapper::ListParams2(API_AddParType** ppParams)
{
unsigned long ii, nParams;
nParams = BMGetHandleSize((GSHandle)ppParams)/sizeof(API_AddParType);
// list params
for (ii = 0; ii < nParams; ii++) {
WriteReport("Param name = \"%s\", double = %f", (*ppParams)[ii].name, (*ppParams)[ii].value.real);
}
}
好吧,讓我們使用類似API_AddParType& param
一些參考變量:
void ParamsListWrapper::ListParams1(API_AddParType** ppParams)
{
unsigned long ii, nParams;
nParams = BMGetHandleSize((GSHandle)ppParams)/sizeof(API_AddParType);
// list params
for (ii = 0; ii < nParams; ii++) {
API_AddParType& param = (*ppParams)[ii];
WriteReport("Param name = \"%s\", double = %f", param.name, param.value.real);
}
}
現在試圖與指針相同的代碼來API_AddParType
:
void ParamsListWrapper::ListParams3(API_AddParType** ppParams)
{
unsigned long ii, nParams;
nParams = BMGetHandleSize((GSHandle)ppParams)/sizeof(API_AddParType);
// list params
for (ii = 0; ii < nParams; ii++) {
API_AddParType* pParam = ppParams[ii];
if (pParam != NULL) {
WriteReport("Param name = \"%s\", double = %f", pParam->name, pParam->value.real);
} else {
WriteReport("Param is NULL");
}
}
}
訪問每一個元素時
(*ppParams)[ii]
一切正常,就像預期
出現分段錯誤。怎麼會這樣?通過指針訪問數據時爲什麼失敗,而引用正常工作?
您是否嘗試啓用所有警告和調試信息(例如Linux上的'g ++ -Wall -g')並使用http://valgrind.org/和'gdb'調試器? –
哎呀!我正在爲此項目使用MSVC 2003。 – ezpresso
您可能會考慮http://www-01.ibm.com/software/awdtools/purify/ –