为什么我会收到此访问权限?

时间:2012-11-29 17:45:21

标签: c++ access-violation char-pointer

我可能在这里做了一些愚蠢的事情,但是因为我在C ++工作已经有一段时间了,并且出于某种原因我在调用sprintf时仍然遇到访问冲突。无论如何,这是我正在使用的代码:

char *value, *result;
int len;
result = "";
mgr.GetObjValue(0, value, len);

for (int i = 0; i < len; i++) 
{
  sprintf(result, "%s %X", result, value[i]);
}

printf("ObjVal: %s\n\n", result);

如果有人好奇GetObjValue做了什么,它只是从我正在使用的API中检索SNMP对象值。这是它的声明:

int SNMPMgr::GetObjValue(int iObjIndex, char *&lpObjValue, int &lenObjValue);

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

sprintf不进行内存分配。它期望得到一个指向可写缓冲区的指针,该缓冲区的长度足以容纳数据。

char *result;

此时,结果的内容未定义。

result = "";

此时,结果指向一个1字节的静态只读字符串(终止空值)。

sprintf(result, "%s %X", result, value[i]);

此时,您只是尝试将一个任意长的字符串写入大小为1的只读区域。糟糕。

做这样的事情:

char result[1024];
sprintf(result, "%s %X", result, value[i]);

请注意,使用snprintfsprintf_s,以避免覆盖缓冲区的可能性,可能是一个好主意。 (由于您使用的是C ++,您也可以轻松使用其中一个C ++格式库,如Boost.Format,为您进行内存分配 - 但这是另一个主题。)

答案 1 :(得分:0)

问题在于:char* result = "";

您正在尝试打印到常量字符串(空字符串)。从sprintf的文档关于第一个参数:

  

指向存储结果C字符串的缓冲区的指针。缓冲区   应该足够大以包含结果字符串。

您需要分配一个缓冲区来打印。