【发布时间】:2014-11-19 04:58:14
【问题描述】:
我正在尝试用 c++ 编写自己的 printf func 以进行实践,但出现以下运行时错误,我不知道为什么:
Access violation reading location 0x33333333.
代码如下:
void myPrintf(char* szStr, ...)
{
va_list marker;
va_start(marker, szStr);
va_arg(marker, char*);
char opCode;
int nLen = istrlen(szStr);
for (int i = 0; i < nLen; i++)
{
if (szStr[i] != '%')
cout << szStr[i];
else
{
if (i + 1 < nLen)
{
opCode = szStr[i + 1];
switch (opCode)
{
case 'd':
cout << va_arg(marker, int);
i += 2;
break;
case 'f':
cout << va_arg(marker, float);
i += 2;
break;
case 's':
cout << va_arg(marker, char*);
i += 2;
break;
default:
cout << '%';
break;
}
}
else
cout << '%';
}
}
cout << endl;
}
我不明白为什么会这样, 有人可以告诉我我做错了什么吗?
我正在使用以下代码调用该函数:
myPrintf("%d %s %f", 5, "test", 10.1);
当程序崩溃时,它向我展示了这段代码:
static size_t __CLRCALL_OR_CDECL length(const _Elem *_First)
{ // find length of null-terminated string
return (*_First == 0 ? 0
: _CSTD strlen(_First));
}
【问题讨论】:
-
那么在你的调试器中,它在哪里崩溃了?你用什么代码调用你的函数?
-
是的,但它在哪里崩溃?使用调试器逐步完成。
-
看起来您需要检查指针是否为 NULL。
-
如果无法使用调试器,请使用
std::cerr从关键位置向控制台写入一些消息,以找出错误发生的位置。 -
我不确定我使用的是 Visual Studio,当它崩溃时显示变量 _First(来自我展示的函数)设置为 0x33333333
标签: c++ arguments variadic-functions