Выделение пространства и объединение в массив без знака в 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 и всегда будет течь. Но это действительно нюанс по сравнению с другими недостатками.

Другие вопросы по тегам