Почему я получаю это нарушение прав доступа?

Я, вероятно, делаю что-то глупое здесь, но я давно работал с 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);

Любая помощь приветствуется

0

Решение

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, это делает распределение памяти для вас — но это совсем другая тема.)

2

Другие решения

Проблема здесь: char* result = "";

Вы пытаетесь напечатать постоянную строку (пустую строку). Из документации по sprintf относительно первого параметра:

Указатель на буфер, где хранится полученная C-строка. Буфер
должно быть достаточно большим, чтобы содержать полученную строку.

Вам нужно выделить буфер для печати.

0

По вопросам рекламы [email protected]