在c语言中分配空间并连接到无符号字符数组

在c语言中分配空间并连接到无符号字符数组,c,realloc,C,Realloc,我正在为一个项目创建一个图像压缩程序。我以这样的方式为图像中的值生成代码,即对于每个灰度值(从0到254),在一个名为codeArray(Huffman编码)的数组中都有一个char*代码 要求有一个返回无符号字符*的函数。我遍历每个像素,并使用codeArray将该像素的灰度值转换为代码 我需要使无符号字符数组随着更多的灰度值被转换并连接到数组的末尾而动态增长 unsigned char* encodedString = malloc(sizeof(char)); i

我正在为一个项目创建一个图像压缩程序。我以这样的方式为图像中的值生成代码,即对于每个灰度值(从0到254),在一个名为codeArray(Huffman编码)的数组中都有一个char*代码

要求有一个返回无符号字符*的函数。我遍历每个像素,并使用codeArray将该像素的灰度值转换为代码

我需要使无符号字符数组随着更多的灰度值被转换并连接到数组的末尾而动态增长

    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]);

        }
unsigned char*encodedString=malloc(sizeof(char));
int width=图像->宽度//图像结构的宽度和高度
int height=图像->高度;
int row,col;
对于(row=0;row您在未初始化的缓冲区上调用
strlen(encodedString)
。这是未定义的行为。您需要零终止
encodedString
的初始内容

unsigned char* encodedString = malloc(1);
//check for malloc errors 
encodedString[0] = '\0';
看起来您没有犯这个错误,但立即提交了另一个错误。您的
realloc
strlen(encodedString)+strlen(code数组[value])留出了空间
但是您忘记了为零终止符分配空间。这可能是导致
strcat
爆炸的原因。通过在
realloc
的size参数中添加一个来修复该问题

正如@Lou所指出的,您的realloc策略的性能可能很差。您最好在函数开始时分配一次缓冲区,因为您可以对其大小设定一个相对较紧的上限


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

+1.或多或少我的观察,除了我喜欢在任何机会宣扬
realloc
的危险;)@David-更不用说为添加到编码字符串中的每个值调用realloc()一次的效率。计算您需要并提前分配的空间量,或者至少使用encodedString的一些二进制增长(即,每次需要增加encodedString数组的大小时,将其大小增加一倍)。@larsmans re。realloc,我知道你的意思,但我觉得主要的重点应该是更明显的错误。这种性质的每一个问题都让我更加欣赏具有真正字符串数据类型的语言的乐趣。谢谢!我在分配内存方面从来都不是很强,也从来没有真正确定自己是否做对了。另外,我知道我想分配给一个单独的指针,并进行错误检查,只是为了保持它干净和简单。