C 发现特定颜色的首次出现-奇怪的分配行为

C 发现特定颜色的首次出现-奇怪的分配行为,c,memory-management,allocation,bmp,alloc,C,Memory Management,Allocation,Bmp,Alloc,我正在编写一个函数,返回第一个指定颜色像素的地址。现在我正在测试检测。目前在50x50 bmp上。考虑到这一准则: dword bmp_find_xy (dword xp, dword yp) { dword w =

我正在编写一个函数,返回第一个指定颜色像素的地址。现在我正在测试检测。目前在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;
}
dword bmp\u find\u xy(dword xp,dword yp)
{                                                                                                
德沃德w=50;
单词bpx=(3*8);
dword偏移量=(2+sizeof(BMP)+sizeof(DIB));
dword行=((bpx*w)*4)/32);
dword pixAddress=(偏移量)+行*yp+((xp*bpx)/8);
返回pixAddress;
}                                                                                                
dword bmp\u dfind\u c(字符*文件名,字节R,字节G,字节B)
{
德沃德w=50;
德沃德h=50;
德沃德尺寸;
int W,H,i;
文件*fp=fopen(“sample.bmp”,“r+b”);
字节*bmp;
fseek(fp,0L,SEEK_END);
尺寸=ftell(fp);
bmp=malloc(大小+48);//注意这行
倒带(fp);
对于(i=0;i=1;H--)
{
对于(W=0;W

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

如果我对您的H减量逻辑有疑问,请原谅。假设你的
H
W
是零基的(它们应该是零基的),我相信:

for(H = h; H >=1; H--)
这样做会更好:

H = h;
while (H--)
如果这确实是向后枚举器
H-1
向下到
0
的意图。(我认为应该如此)。修正这个问题,我确信你可以正确分配你的缓冲区。如前所述,期望是您正在
H
th行中搜索以启动循环,而这样的行不在您的缓冲区中

如果for循环是强制性的,那么它实际上需要更多的工作。像这样看似无辜的事情:

for(H=(h-1); H>=0; --H)
无法作为通用机制运行。当
h
和无符号类型以
0
开头时会发生什么情况?。表达式
(h-1)
将引入下溢。哎哟当然,您可以通过执行以下操作来“修复”此问题:

if (h)
{
    for(H=(h-1); H>=0; --H)
    ....
}
但这只是在原本是个坏主意的基础上增加了更多的漏洞

以下内容将起作用,但imho不太清楚:

for (H=h; H--;)
这实现了与while循环相同的逻辑,但代价是混淆。它给表带来的一件(也是唯一一件)事情是本地var声明,这可能会很有帮助:

for (dword var=h; var--;)

有很多方法可以做到这一点,这些只是少数。我发现第一个在你的上下文中是最清楚的。祝你好运。

如果我对你的H减量逻辑有疑问,请原谅。假设你的
H
W
是零基的(它们应该是零基的),我相信:

for(H = h; H >=1; H--)
这样做会更好:

H = h;
while (H--)
如果这确实是向后枚举器
H-1
向下到
0
的意图。(我认为应该如此)。修正这个问题,我确信你可以正确分配你的缓冲区。如前所述,期望是您正在
H
th行中搜索以启动循环,而这样的行不在您的缓冲区中

如果for循环是强制性的,那么它实际上需要更多的工作。像这样看似无辜的事情:

for(H=(h-1); H>=0; --H)
无法作为通用机制运行。当
h
和无符号类型以
0
开头时会发生什么情况?。表达式
(h-1)
将引入下溢。哎哟当然,您可以通过执行以下操作来“修复”此问题:

if (h)
{
    for(H=(h-1); H>=0; --H)
    ....
}
但这只是在原本是个坏主意的基础上增加了更多的漏洞

以下内容将起作用,但imho不太清楚:

for (H=h; H--;)
这实现了与while循环相同的逻辑,但代价是混淆。它给表带来的一件(也是唯一一件)事情是本地var声明,这可能会很有帮助:

for (dword var=h; var--;)

有很多方法可以做到这一点,这些只是少数。我发现第一个在你的上下文中是最清楚的。祝您好运。

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

尝试将循环替换为:

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

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

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

尝试将循环替换为:

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

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

大小的实际值是多少?可能是
-1
。大小的实际值是
7654
。图像的大小实际上是7654字节。不,当然不是
-1
为什么会是
-1
?如果那是真的。。分配的47个字节必须足够。dword
@FiddlingBits的类型是什么
dword
类型是
无符号长的
ftell
错误时返回
-1
大小的实际值是多少?可能是
-1
。大小的实际值是
7654
。图像的大小实际上是7654字节。不,当然不是
-1
为什么会是
-1
?如果那是真的。。分配的47个字节足够了。
dword
@FiddlingBits的类型是什么
dword
类型是
无符号长的
ftell
返回
-1
错误。@Edenia很乐意提供帮助。这是为数不多的几个可以使用后减量/增量的地方之一