設置
|
登錄
|
註冊
首頁
>
Windows API吧
>
瀏覽帖子
回復帖子
|
只看樓主
目前共有
15
篇帖子。
首頁
上一頁
1
2
【讲解】位图的结构
11樓
巨大八爪鱼
2016-6-24 11:25
请看下面这句话:
int *a = (int *)malloc(2 * sizeof(int));
这句代码动态分配了8字节的内存,然后用指针变量p保存该内存块的首地址。然而我们知道int *型指针只能操作4字节的内存,也就是说*a只能访问到该内存块的前4个字节。
不过呢,指针可以进行加减运算,所以我们可以用*(a+1)来访问后4个字节。当然a[1]也是可以的。
最后free(a)释放的是整个8字节的内存块,而非sizeof(int)=4字节。
12樓
巨大八爪鱼
2016-6-24 11:33
同样的道理,虽然BITMAPINFO结构的第二个成员bmiColors数组只有一个元素,但是我们完全可以用下面的方法搞出多个元素来:
BITMAPINFO *p = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + n * sizeof(RGBQUAD));
其中n可以为任意自然数,包括0,表示调色板中的颜色数目。
然后我们就可以使用p->bmiColors[3]这样大于0的下标了。
最后free(p)也是释放整个内存空间,而不是只是sizeof(BITMAPINFO)。
13樓
巨大八爪鱼
2016-6-24 11:36
所以,BITMAPINFO这个结构体类型一般不拿来直接定义变量,而是常使用其指针类型。
另外,对于之前提到的int *a,我们也可以通过强制类型转换来一次性访问8个字节:
*(long long *)a
14樓
巨大八爪鱼
2016-6-24 13:54
位图数据第二维长度的确定方法:使用<math.h>中的ceil函数。
#include <math.h>
#include <stdio.h>
int main(void)
{
int i, n;
for (i = 0; i < 24; i++)
{
n = (int)ceil(i / 4.0) * 4;
printf("%d: %d\n", i, n);
}
return 0;
}
【输出】
0: 0
1: 4
2: 4
3: 4
4: 4
5: 8
6: 8
7: 8
8: 8
9: 12
10: 12
11: 12
12: 12
13: 16
14: 16
15: 16
16: 16
17: 20
18: 20
19: 20
20: 20
21: 24
22: 24
23: 24
15樓
巨大八爪鱼
2016-6-24 14:33
屏幕截图:
https://zh.arslanbar.net/post.php?t=24202
首頁
上一頁
1
2
內容轉換:
不轉換
大陆简体
台灣正體
港澳繁體
马新简体
回復帖子
內容:
用戶名:
您目前是匿名發表
驗證碼:
看不清?換一張
©2010-2025 Arslanbar [手機版] [
桌面版
]
除非另有聲明,
本站
採用
創用CC姓名標示-相同方式分享 3.0 Unported許可協議
進行許可。