我可能在这里做了一些愚蠢的事情,但是因为我在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);
非常感谢任何帮助
答案 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]);
请注意,使用snprintf或sprintf_s,以避免覆盖缓冲区的可能性,可能是一个好主意。 (由于您使用的是C ++,您也可以轻松使用其中一个C ++格式库,如Boost.Format,为您进行内存分配 - 但这是另一个主题。)
答案 1 :(得分:0)
问题在于:char* result = "";
您正在尝试打印到常量字符串(空字符串)。从sprintf的文档关于第一个参数:
指向存储结果C字符串的缓冲区的指针。缓冲区 应该足够大以包含结果字符串。
您需要分配一个缓冲区来打印。