【发布时间】:2014-08-09 22:50:25
【问题描述】:
我正在编写一个函数,它返回具有指定颜色的第一个定位像素的地址。现在我正在测试检测。目前在 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),为什么它会溢出,这对我来说毫无意义。
【问题讨论】:
-
size的实际值是多少?可能是-1。 -
size的实际值为
7654。并且图像的大小是真正的 7654 字节。不,当然不是-1为什么会是-1?如果这是真的.. 分配的 47 个字节就足够了。 -
dword的类型是什么。 -
@FiddlingBits
dword类型是unsigned long -
ftell出错时返回-1。
标签: c memory-management allocation bmp alloc