在c中分配空间并连接到unsigned char数组

时间:2011-10-24 21:43:34

标签: c realloc

我正在为项目创建一个图像压缩器。我为图像中的值生成代码,使得对于每个灰度值(从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出现故障。

帮助表示赞赏!

1 个答案:

答案 0 :(得分:4)

您在未初始化的缓冲区上调用strlen(encodedString)。这是未定义的行为。您需要对encodedString的初始内容进行零终止。

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

看起来你逃脱了这个错误,但随后又立即提交了另一个错误。您的reallocstrlen(encodedString)+strlen(codeArray[value])留出了空间,但您忘记为零终结符分配空间。据推测,这是导致strcat炸弹的原因。通过将size参数添加到realloc来修复该问题。

正如@Lou指出你的realloc策略的表现可能很差。你可能最好在函数开始时分配缓冲区一次,因为大概你可以在它的大小上设置一个相对紧凑的上限。

而且你也不应该写ptr = realloc(ptr, ...),因为你无法从realloc的失败中恢复并且总是会泄漏。但与其他故障相比,这确实是一个细微差别。