Выделение пространства и объединение в массив без знака в c - PullRequest
2 голосов
/ 25 октября 2011

Я создаю компрессор изображений для проекта. Я генерирую коды для значений на изображении таким образом, чтобы для каждого значения серого (от 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 Ответ

4 голосов
/ 25 октября 2011

Вы вызываете strlen(encodedString) в неинициализированном буфере.Это неопределенное поведение.Вам необходимо завершить нулевое начальное содержимое encodedString.

unsigned char* encodedString = malloc(1);
//check for malloc errors 
encodedString[0] = '\0';

Похоже, что вам сойдет с рук эта ошибка, но затем сразу же зафиксируйте еще одну.Ваш realloc освобождает место для strlen(encodedString)+strlen(codeArray[value]), но вы забыли выделить место для нулевого терминатора.Предположительно это то, что заставляет strcat бомбить.Исправьте эту проблему, добавив единицу к параметру размера в realloc.

. Как указывает @Lou, производительность вашей стратегии realloc может быть низкой.Возможно, вам лучше выделить буфер один раз в начале функции, поскольку, вероятно, вы можете установить относительно жесткую верхнюю границу для его размера.

И вам также не следует писать ptr = realloc(ptr, ...), поскольку вы не будетесможет восстановиться после сбоя realloc и всегда будет течь.Но это действительно нюанс по сравнению с другими недостатками.

...