0

我可能在这里做了一些愚蠢的事情,但是自从我在 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);

任何帮助将非常感激

4

2 回答 2

2

sprintf不进行内存分配。它期望得到一个指针,指向一个足够长的可写缓冲区来保存数据。

char *result;

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

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,它会为您分配内存 - 但这是另一个话题。)

于 2012-11-29T17:49:52.160 回答
0

问题在这里:char* result = "";

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

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

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

于 2012-11-29T17:49:32.613 回答