【发布时间】:2012-10-04 11:59:46
【问题描述】:
下面的函数接受一个指向API_AddParType结构的指针数组的指针,并列出每个数组元素的一些字段。使用(*ppParams)[ii] 访问每个元素时,一切都按预期工作:
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" );
}
}
}
出现分段错误。怎么会这样?为什么通过指针访问数据会失败,而引用工作没有任何问题?
【问题讨论】:
-
您是否尝试启用所有警告和调试信息(例如 Linux 上的
g++ -Wall -g)并使用 valgrind.org 和gdb调试器? -
糟糕!我正在为这个项目使用 MSVC 2003。