我对使用 C++ 非常缺乏经验,但我正在尝试在 64 位 XP 平台上为 matlab编译SBML 工具箱的 2.0.2 版。SBML 工具箱依赖于Xerces 2.8 和libsbml 2.3.5。
我已经能够在 32 位机器上构建和编译工具箱,并且在我测试它时它可以工作。但是,在 64 位机器上重建它(这是一个巨大的 PITA!)后,当我尝试用它读取长 .xml 文件时出现分段错误。
我怀疑这个问题是由指针地址问题引起的。
分段错误的堆栈跟踪开始于:
[0] 000000003CB3856E libsbml.dll+165230 (StringBuffer_append+000030) [6] 000000003CB1BFAF libsbml.dll+049071 (EventAssignment_createWith+001631) [12]000000003CB1C1D7 libsbml.dll+049623(SBML_formulaToString+000039) [18] 000000003CB2C154 libsbml.dll+115028 (
所以我正在查看 libsbml 代码中的 StringBuffer_append 函数:
LIBSBML_EXTERN
void
StringBuffer_append (StringBuffer_t *sb, const char *s)
{
unsigned long len = strlen(s);
StringBuffer_ensureCapacity(sb, len);
strncpy(sb->buffer + sb->length, s, len + 1);
sb->length += len;
}
确保容量看起来像这样:
LIBSBML_EXTERN
void
StringBuffer_ensureCapacity (StringBuffer_t *sb, unsigned long n)
{
unsigned long wanted = sb->length + n;
unsigned long c;
if (wanted > sb->capacity)
{
/**
* Double the total new capacity (c) until it is greater-than wanted.
* Grow StringBuffer by this amount minus the current capacity.
*/
for (c = 2 * sb->capacity; c < wanted; c *= 2) ;
StringBuffer_grow(sb, c - sb->capacity);
}
}
和 StringBuffer_grow 看起来像这样:
LIBSBML_EXTERN
void
StringBuffer_grow (StringBuffer_t *sb, unsigned long n)
{
sb->capacity += n;
sb->buffer = (char *) safe_realloc(sb->buffer, sb->capacity + 1);
}
有没有可能
strncpy(sb->buffer + sb->length, s, len + 1);
在 StringBuffer_append 是我的段错误的来源?
如果是这样,有人可以建议修复吗?我真的不懂 C++,而且对指针和内存寻址特别困惑,所以我可能不知道你在说什么——我需要一些帮助。
此外,我将构建过程的详细信息放在此处,以防其他人正在尝试使用 Microsoft Visual C++ Express Edition 为 64 位系统编译 C++。
提前致谢!
-本