我正在为项目创建一个图像压缩器。我为图像中的值生成代码,使得对于每个灰度值(从0到254),在数组中都有一个名为codeArray(Huffman Encoding)的char *代码。
要求是有一个返回unsigned char *的函数。我遍历每个像素,并使用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]);
}
我尝试在strcat之后使用print语句运行它,并发现它打印直到有24个字符然后开始打印垃圾然后Seg出现故障。
帮助表示赞赏!
答案 0 :(得分:4)
您在未初始化的缓冲区上调用strlen(encodedString)
。这是未定义的行为。您需要对encodedString
的初始内容进行零终止。
unsigned char* encodedString = malloc(1);
//check for malloc errors
encodedString[0] = '\0';
看起来你逃脱了这个错误,但随后又立即提交了另一个错误。您的realloc
为strlen(encodedString)+strlen(codeArray[value])
留出了空间,但您忘记为零终结符分配空间。据推测,这是导致strcat
炸弹的原因。通过将size参数添加到realloc
来修复该问题。
正如@Lou指出你的realloc策略的表现可能很差。你可能最好在函数开始时分配缓冲区一次,因为大概你可以在它的大小上设置一个相对紧凑的上限。
而且你也不应该写ptr = realloc(ptr, ...)
,因为你无法从realloc
的失败中恢复并且总是会泄漏。但与其他故障相比,这确实是一个细微差别。