Проблемы с упаковкой и динамическим размещением - PullRequest
0 голосов
/ 26 октября 2011

У меня проблемы с этим фрагментом кода.

Я строю кодировщик изображения. В основном я построил массив кодирования, используя значения из изображения. Массив называется «коды» и хранит представления char * того, какими будут двоичные значения.

В этом разделе читается значение серого каждого пикселя, ищется его значение в массиве 'codes' и упаковывается байт двоичных значений (tempString). Как только 8 значений были прочитаны, tempString добавляется в конец уже закодированного байтового массива без знака (encodedString).

Программа работает до тех пор, пока numBytes не составит около 27 тысяч байт, после чего возникнут ошибки.

Я знаю, что это длинный путь, но я надеюсь, что это явная проблема с тем, как я распределяю память.

    unsigned char* encodedString = malloc(1);
    unsigned char* tempString;
    encodedString[0] = '\0';

    unsigned char packedString = 0;
    int one = 1;
    int zero = 0;
    int width = image->width;
    int height = image->height;
    int row, col, count=0, numBytes=0; //numBytes is the number of already encoded bytes
    for(row = 0; row<height; row++)
    for(col = 0; col<width; col++)
    {
            int value = image->pixel[row][col];    //Gets the pixel value(0-255)
            char* code = codes[value];             //Gets the compression code for the color

            int length = strlen(code);

            for(index=0;index<length;index++)
            {
                    //This loop goes through every character in the code 'string'
                    if(code[index] == '1')
                            packedString = packedString | one;
                    else
                            packedString = packedString | zero;

                    count++;
                    if(count == 8)  //If 8 consecutive values have been read, add to the end of the encoded string
                    {
                            tempString = realloc(encodedString, (strlen(encodedString)+2));
                            if(tempString == NULL)
                                    return NULL;

                            encodedString = tempString;

                            //Add newly formed binary byte to the end of the already encoded string
                            encodedString[numBytes] = packedString;
                            //Add terminating character to very end             
                            encodedString[numBytes+1] = '\0';

                            count=0; //reset count
                            numBytes++;
                    }
                    else
                         packedString = packedString << 1;
            }

            *length_of_encoded_string += strlen(codes[value]);

    }

1 Ответ

0 голосов
/ 26 октября 2011

Не вызывайте strlen(str) для двоичной строки! Используйте вместо этого numBytes. strlen вернет индекс первого нуля, который он находит в вашей строке. Тогда realloc перестанет увеличивать размер вашей строки, приводя к segfault при доступе к нему с помощью numBytes.

...