Я, вероятно, делаю что-то глупое здесь, но я давно работал с 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, он просто получает значение объекта SNMP из используемого мной API. Вот это объявление:
int SNMPMgr::GetObjValue(int iObjIndex, char *&lpObjValue, int &lenObjValue);
Любая помощь приветствуется
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, это делает распределение памяти для вас — но это совсем другая тема.)
Проблема здесь: char* result = "";
Вы пытаетесь напечатать постоянную строку (пустую строку). Из документации по sprintf относительно первого параметра:
Указатель на буфер, где хранится полученная C-строка. Буфер
должно быть достаточно большим, чтобы содержать полученную строку.
Вам нужно выделить буфер для печати.