gpt4 book ai didi

c++ - 为什么我会遇到这种访问冲突?

转载 作者:行者123 更新时间:2023-11-28 03:27:08 25 4
gpt4 key购买 nike

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

任何帮助将不胜感激

最佳答案

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

关于c++ - 为什么我会遇到这种访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com