可以对malloc缓冲区执行整数运算(例如加法或减法吗?

问题描述 投票:0回答:1

要了解JPEG压缩,我下载了一个正在检查的简单BMP / JPEG encoder。我有几个问题,希望有人可以帮助我。我不是训练有素的计算机科学家,而是一个业余程序员。感谢您的帮助。

以下代码读取位图,为简洁起见,我省略了一些信息。我知道位图标头是作为结构体编写的,因此可以将组件直接读取为变量,而无需进行迭代。

BYTE是uint8_t的typedef

    int bmp_load(BMP *pb, char *file)
{
    BMPFILEHEADER header = {0};
    FILE         *fp     = NULL;
    BYTE         *pdata  = NULL;
    int           i;

    fp = fopen(file, "rb");
    if (!fp) return -1;

    fread(&header, sizeof(header), 1, fp);
    pb->width  = header.biWidth;
    pb->height = header.biHeight;
    pb->stride = ALIGN(header.biWidth * 3, 4);
    pb->pdata  = malloc(pb->stride * pb->height);// allocate a byte for each element of bitmap?
    if (pb->pdata) {
        pdata  = (BYTE*)pb->pdata + pb->stride * pb->height; // Title question: Cast pdata as uint8_t buffer but what is the addition for? I think it has to do with padding a BMP file.  Without addition there is a bus error: 10 
        for (i=0; i<pb->height; i++) {
            pdata -= pb->stride; // What is the subtraction for? 
            fread(pdata, pb->stride, 1, fp);
        }
    }

    fclose(fp);
    return pb->pdata ? 0 : -1; // If pdata was being modified in the for loop, why is pb->pdata returned? 
}

我的问题在代码中作为注释,也粘贴在下面。加法有什么作用?我认为这与填充BMP文件有关。不添加总线错误:10

    pdata  = (BYTE*)pb->pdata + pb->stride * pb->height;

减法是什么?

    pdata -= pb->stride;

最后,为什么会返回pb-> pdata,但实际上它的pdata在代码中已被修改?

c bmp
1个回答
1
投票

这是将文件file中的数据读取到缓冲区pb->pdata中,大小为pb->stride,其大小为相反顺序。块数为pb->height

指针pdata用于指示将下一个块放置在缓冲区中的位置。由于缓冲区的总大小为pb->stride * pb->height,因此行>>

pdata  = (BYTE*)pb->pdata + pb->stride * pb->height;

pdata设置为指向缓冲区pb->pdata的末尾(即指向最后一个元素之后的元素)。在循环的第一次迭代中从pb->stride中减去pdata时,pdata将指向要放置第一个块的位置,并填充了pb->stride个字节。缓冲。在连续的迭代中,pdata继续递减,以相反的顺序将块写入缓冲区,直到最后一个块位于缓冲区pb->pdata的开头。如果省略初始加法,则pdata将开始指向缓冲区的

beginning

,然后减法将使其指向before缓冲区的开始。然后尝试在该位置进行读取将超出范围,这毫不奇怪会导致崩溃。pdata只是像索引变量一样始终用作临时变量。调用方希望有一个指向缓冲区起始点的指针,而不是指向缓冲区中某个随机位置的指针,因此返回pb->pdata是有意义的。这是非常常见的模式。 (尽管事实证明,在函数pdata的末尾实际上等于pb->pdata,所以在这种特殊情况下,该函数可能已经返回了pdata,具有相同的效果。)
© www.soinside.com 2019 - 2024. All rights reserved.