我使用C ++已经很久了,所以请耐心等待。
我是C#开发人员,但这个C ++控制台应用程序崩溃了,我现在正在管理它。我目前正在使用VS2010进行调试。
由于机密性和大量代码,我无法发布所有代码。
控制台实际上是读取和解析6MB XML文件。到目前为止,我已经收到了“访问冲突读取位置0xcccccccc”的所有内容,其中包含以下代码:
strtok_s(0, "=", &token);
当我将光标放在“& token”上时,我看到错误“token = 0xcccccccc”。
我想澄清一些事情:
strtok_s(buf, "=", &token);
strtok_s(0, "=", &token);
strtok_s(0, "=", &token);
0 作为参数做什么?我假设在第一个* strtok_s *中,标记将指向 buf 中char'='的第一个实例。但在第二条指令中,'0'的目的是什么?它是否在令牌中寻找'='?
显然,XML中发生了一些变化。所以,最后,考虑到这是解析一个6MB的文件(w / 870K文本行)和读取XML的C ++函数长达700多行,调试它的最佳方法是什么?不,切割我的手腕还没有被考虑......但是。
感谢。
答案 0 :(得分:2)
将0作为第一个参数传递(NULL可能更具可读性)意味着“在字符串中查找下一个标记”。将0xcccccccc视为最后一个参数的值(“token”是错误的名称)会告诉您从未在字符串中搜索第一个标记。换句话说,从未对strtok_s(buf, "=". &token)
进行过调用。或者,之前对strtok_s()的调用未保留“token”值。所以它不再知道需要搜索什么字符串。 KABOOM。
在任何一种情况下,代码中的硬错误都不受字符串本身的影响。
答案 1 :(得分:0)
0,或者将NULL作为第一个参数,只需重新使用令牌
答案 2 :(得分:0)
以下是link to MSDN,其中借助示例解释了strtok_s
的用法。
当您至少调用strtok_s
一次时,第一个参数可以为NULL,第三个参数已包含指向最后找到的标记的指针。在这种情况下,对strtok_s
的下一次调用可以从最后一次调用找到令牌的位置开始。
具体来说,在您的情况下,访问冲突通常表示指针中存在缓冲区溢出或垃圾。 token
变量发生了变化,导致其值变为0xcccccccc
。您需要指出token
对此值采用的代码,并找出导致溢出的原因。