- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对使用 C++ 非常缺乏经验,但我正在尝试编译 SBML toolbox 的 2.0.2 版适用于 64 位 XP 平台上的 matlab。 SBML 工具箱依赖于 Xerces 2.8 和 libsbml 2.3.5.
我已经能够在 32 位机器上构建和编译工具箱,并且在我测试时它可以正常工作。但是,在 64 位机器(这是一个巨大的 PITA!)上重建它之后,当我尝试用它读取长 .xml 文件时出现段错误。
我怀疑问题是由 pointer addresses issues 引起的.
来自段错误的 Stack Trace 开始于:
[ 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 (
So I'm looking at the StringBuffer_append function in the libsbml code:
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;
}
ensureCapacity 看起来像这样:
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++,并且对指针和内存寻址特别困惑,所以可能不知道你在说什么 - 我需要一些帮助。
此外,我将构建过程的详细信息放在网上 here ,以防其他人尝试使用 Microsoft Visual C++ Express Edition 为 64 位系统编译 C++。
提前致谢!
-本
最佳答案
尝试打印或使用调试器来查看您为某些中间变量获得的值。在 StringBuffer_append() O/P len 中,在 StringBuffer_ensureCapacity() 中观察循环之前和循环中的 sb->capacity 和 c。查看这些值是否有意义。
访问超出字符串末尾的数据可能会导致段错误。
它在 32 位机器上运行而不是 64 位操作系统上运行的奇怪事实也是一个线索。两台机器的物理和页面文件内存大小是否相同?此外,在 64 位机器中,内核空间可能比 32 位机器大,并且占用了 32 位 O/S 内存空间用户部分中的一些可用内存空间。对于 XML,整个文档必须适合内存。如果这是问题所在,可能有一些开关可以设置大小。只有当您使用非常大的字符串时,机器的差异才是导致问题的原因。如果字符串不是很大,则可能是库或实用程序方法在 64 位环境中无法正常工作的问题。
此外,如果您别无选择,请使用一个简单/小的 xml 文件开始。
你在哪里初始化sb->length。您的问题可能出在 strncpy() 中,但我不知道为什么 32 位 -> 64 位 O/S 更改会很重要。最好的办法是查看中间值,这样您的问题就会很明显。
关于c++ - Win XP x64 上的段错误在 XP x32 上不会发生 - strncpy 问题?怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/586597/
我敢肯定以下这个问题已经被问了很多,但顺便问一下,因为我还没有找到答案。 我必须重新创建函数 strncpy(我不需要/不想要任何解决方案)并且我无法重现此函数的确切行为。 这是我的代码: int m
我对 strncpy 功能感到非常沮丧。我做了这样的事情: char *md5S; //which has been assign with values, its length is 44 char
我一直无法让这部分代码正常工作。我试图获取一个要复制的字符数组,这样我就可以计算出有多少 token 可以动态分配并保存它们以供检查环境变量。但是,当它尝试对原始字符串进行 strncpy 时,我一直
编辑:变量名 我正在制作一个链表,当我尝试释放一个节点时,它给了我一个错误。我跟踪我的代码,发现当我使用这段代码创建节点时,我的错误就根深蒂固了。 奇怪的是,如果我分配的字符比我想要的少一个,它就可以
当我在我的机器上运行一些代码时,它会按照我的预期运行。 当我在同事身上运行它时,它表现不佳。这就是发生的事情。 我有一个字符串,其值为: croc_data_0001.idx 当我对长度为 18 的字
基本上,我的程序使用链表向机器人发出命令。我正在使用 strcpy() 将命令复制到我的链表节点结构中,但它在末尾添加了不需要的字符(即“right”变成了“右\000-°\rd")。我使用过 str
我编写了一个程序来查找最长的单词并打印它。 我的代码是: #include #include #include int MaxWord(char text[],char[]); int main
如果我对字符串 cat 和 dog 使用 strncpy 函数。我不明白\0字符是否被计算在内,所以我想知道最终结果是否是catdo?还是类似于 cat\0do strncpy("猫", "狗", 2
我想做的是要求用户输入以下格式的内容:cd 目录。然后我将“cd”存储在一个字符串中,将“directory”存储在另一个字符串中。这是我的代码: void main() { char buf[
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我正在为一个项目使用 C 样式字符串,但我自己有点困惑。我正在检查字符串以查看它们的前缀是什么(zone_、player_ 等),然后获取字符串的其余部分。 else if(strncmp(info,
我刚开始使用 C++,所以我可能在这里犯了一个愚蠢的错误。下面是我的代码以及注释中的输出。我正在使用 Xcode。 #include #include using namespace std;
我正在审查函数 strncpy 的字符串操作函数。我有 7 个输出而不是 3 个,谁能解释一下?非常感谢。 char x[] = "just see that."; char y[15
#include using namespace std #include int main(){ char token[] = "some random string"; cha
我最近遇到了一些遗留代码,并注意到有时(并非总是)以下代码片段需要很长时间才能执行。 #define NUM_OF_RECORDS 100000 char* pzBuffer = new char[N
我正在探索关于 strncpy 的 C,因为大多数人说它比 strcpy 更安全(附加参数,长度,以避免缓冲区溢出)。我还想找出非空终止字符串对程序的影响。这是我拥有的代码片段。 char passw
我想在 C 中模拟一个向下增长的调用堆栈并将以下内容压入堆栈: 这是我写的测试代码,我只尝试压入字符串,字对齐,然后将地址压入刚刚压入的字符串: #include #include #includ
我是 c 的新手,想将字符串分成两部分。这是我的代码: #include #include #include void test(char** a, char** b) { const ch
我需要通过添加“_out”和更改扩展名来修改通过参数传递的文件名。所以,首先,我复制没有扩展名的旧文件的名称,就像那样 char* arg1 = argv[1]; char* var1 = N
我正在逐行读取文件,其中每一行的格式为: “数字 1\t 数字 2”。 我正在使用 strtok 和 strncpy 拆分然后根据需要存储这两个值。但是,我发现在 strncpy 之后,number1
我是一名优秀的程序员,十分优秀!