Выделение пространства и объединение в массив без знака в c
Я создаю компрессор изображений для проекта. Я генерирую коды для значений на изображении таким образом, чтобы для каждого значения серого (от 0 до 254) в массиве имелся код char*, называемый codeArray (Huffman Encoding).
Требуется наличие функции, которая возвращает беззнаковый символ *. Я прохожу каждый пиксель и преобразую значение серого этого пикселя в код, используя codeArray.
Мне нужно, чтобы массив unsigned char динамически увеличивался по мере того, как все значения серого преобразуются и объединяются до конца массива.
unsigned char* encodedString = malloc(sizeof(char));
int width = image->width; //width and height of image structure
int height = image->height;
int row, col;
for(row = 0; row<height; row++)
for(col = 0; col<width; col++)
{
int value = image->pixel[row][col]; //gets the grey value
encodedString = realloc(encodedString, (strlen(encodedString)+strlen(codeArray[value])));
strcat(encodedString, codeArray[value]);
}
Я попытался выполнить это с оператором print после strcat и обнаружил, что он печатается до тех пор, пока не появятся 24 символа, затем начнется печать мусора, а затем ошибка Seg.
Помощь оценена!
1 ответ
Ты звонишь strlen(encodedString)
на неинициализированном буфере. Это неопределенное поведение. Вам нужно обнулить начальное содержимое encodedString
,
unsigned char* encodedString = malloc(1);
//check for malloc errors
encodedString[0] = '\0';
Похоже, что вам сойдет с рук эта ошибка, но затем сразу же совершите еще одну. Ваш realloc
освобождает место для strlen(encodedString)+strlen(codeArray[value])
но вы забыли выделить место для нулевого терминатора. Предположительно это то, что вызывает strcat
бомбить. Исправьте эту проблему, добавив один к параметру размера в realloc
,
Как указывает @Lou, производительность вашей стратегии перераспределения может быть низкой. Возможно, вам лучше выделить буфер один раз в начале функции, так как, вероятно, вы можете установить относительно жесткую верхнюю границу его размера.
И тебе тоже не стоит писать ptr = realloc(ptr, ...)
так как вы не сможете восстановиться после сбоя realloc
и всегда будет течь. Но это действительно нюанс по сравнению с другими недостатками.