-1

在 strcat 函数中使用下面的代码,我可以看到第一个字符串数据中只有 4-5 个字节是正确的,其余数据是一些存储在内存中的垃圾。 这里可能有什么问题,可以做些什么来克服和连接所有字符串?

char* fileHeader = createBitmapFileHeader(height, stride);  //14 bytes
char* infoHeader = createBitmapInfoHeader(height, width);   //40 bytes
char* pixels;
pixels = (char*)malloc(246*sizeof(char));
pixels[0]='\0';
strcat(pixels,fileHeader);
strcat(pixels,infoHeader);
strcat(pixels,image); //image size is 192 bytes
unsigned char* createBitmapFileHeader (int height, int stride)
{
    int fileSize = FILE_HEADER_SIZE + INFO_HEADER_SIZE + (stride * height);

    static unsigned char fileHeader[] = {
        0,0,     /// signature
        0,0,0,0, /// image file size in bytes
        0,0,0,0, /// reserved
        0,0,0,0, /// start of pixel array
    };
    fileHeader[ 0] = (unsigned char)('B');
    fileHeader[ 1] = (unsigned char)('M');
    fileHeader[ 2] = (unsigned char)(fileSize      );
    fileHeader[ 3] = (unsigned char)(fileSize >>  8);
    fileHeader[ 4] = (unsigned char)(fileSize >> 16);
    fileHeader[ 5] = (unsigned char)(fileSize >> 24);
    fileHeader[10] = (unsigned char)(FILE_HEADER_SIZE + INFO_HEADER_SIZE);
    return fileHeader;
}

unsigned char* createBitmapInfoHeader (int height, int width)
{
    static unsigned char infoHeader[] = {
        0,0,0,0, /// header size
        0,0,0,0, /// image width
        0,0,0,0, /// image height
        0,0,     /// number of color planes
        0,0,     /// bits per pixel
        0,0,0,0, /// compression
        0,0,0,0, /// image size
        0,0,0,0, /// horizontal resolution
        0,0,0,0, /// vertical resolution
        0,0,0,0, /// colors in color table
        0,0,0,0, /// important color count
    };

    infoHeader[ 0] = (unsigned char)(INFO_HEADER_SIZE);
    infoHeader[ 4] = (unsigned char)(width      );
    infoHeader[ 5] = (unsigned char)(width >>  8);
    infoHeader[ 6] = (unsigned char)(width >> 16);
    infoHeader[ 7] = (unsigned char)(width >> 24);
    infoHeader[ 8] = (unsigned char)(height      );
    infoHeader[ 9] = (unsigned char)(height >>  8);
    infoHeader[10] = (unsigned char)(height >> 16);
    infoHeader[11] = (unsigned char)(height >> 24);
    infoHeader[12] = (unsigned char)(1);
    infoHeader[14] = (unsigned char)(BYTES_PER_PIXEL*8);

    return infoHeader;
}

//现在不关心释放动态内存,我在别的地方做。

CreateBitmapFileHeader 和 CreateBitmapInfoHeader 的屏幕截图

像素内存中容纳的乱码数据的屏幕截图

4

1 回答 1

-1

像素未启动,将填充已留在内存中的随机数据。如果您希望它是一个空字符串,您可以简单地执行pixels[0] = '\0'.

于 2021-11-05T10:37:05.573 回答