このコードに問題があります。
画像エンコーダーを作成しています。基本的に、画像の値を使用してエンコーディング配列を作成しました。この配列は「コード」と呼ばれ、バイナリ値がどうなるかを示すchar*表現を格納します。
このセクションでは、各ピクセルのグレー値を読み取り、その値を「codes」配列で検索し、1バイトのバイナリ値(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]);
}