c - 查找特定颜色的第一次出现 - 奇怪的分配行为

标签 c memory-management allocation bmp alloc

我正在编写一个函数,它返回具有指定颜色的第一个定位像素的地址。现在我正在测试检测。当前为 50x50 bmp。考虑这段代码:

dword bmp_find_xy (dword xp, dword yp)                                          
{                                                                                                
    dword w = 50;
    word bpx = (3*8);
    dword offset = (2+sizeof(BMP)+sizeof(DIB));
    dword row = (((bpx * w) * 4) / 32);
    dword pixAddress = (offset) + row * yp + ((xp * bpx) / 8);

    return pixAddress;
}                                                                                                

dword bmp_dfind_c (char *FILE_NAME, BYTE R, BYTE G, BYTE B)
{
    dword w = 50;
    dword h = 50;
    dword size;

    int W, H, i;

    FILE* fp = fopen("sample.bmp", "r+b");
    BYTE* bmp;

    fseek(fp, 0L, SEEK_END);
    size = ftell(fp);
    bmp = malloc(size+48); // note this line
    rewind(fp);

    for(i=0; i<size; i++)
    bmp[i] = fgetc(fp);

    fseek(fp, 54, SEEK_SET);

    for(H = h; H >=1; H--)
    {
        for(W = 0; W < w; W++)
        {
            if(bmp[bmp_find_xy(FILE_NAME, W, H)] == 255)
            printf("There is a pix with maxed value");
        }
    }
    fclose(fp);
    return 1;
}

所以..因为我使用的是古老的编译器并且没有优化..如果我不将至少 +48 设置为大小,我会收到缓冲区溢出错误。为什么是48?如果我只放置对我来说毫无意义的 malloc(size) 为什么它会溢出。

最佳答案

您的 H 循环是错误的。如果您的图像是 100 像素高,您的循环是从 101 到 1 而不是 99 到 0。因此,bmp_find_xy 计算出错误的索引。

尝试将循环替换为:

H = h;
while (h-- > 0) {

这种模式有时被戏称为“goes to operator”。这是将循环中的无符号变量递减到零的安全方法。

关于c - 查找特定颜色的第一次出现 - 奇怪的分配行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25223846/

相关文章:

c - 使用 Realloc 超过 3 次时出现段错误

c# - 我怎样才能占用内存来测试另一个应用程序?

c - 如何在 C 中编写线程安全、高效、无锁的内存分配器?

c - 为什么在 C 中永远递减一个 unsigned int 循环?

c - String #define 返回一个随机整数

C-Linux-有什么方法可以将命令 "history"传递给 Linux shell?

objective-c - uinavigationcontroller 堆栈内存管理

python-3.x - 合并到 1 后删除以前的 pandas 表

c - 在 struct - c 中动态分配数组

c++ - FFTW:IFFT后信号由噪声组成