LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: sybaselu

关于数据类型奇怪的问题

[复制链接]
发表于 2004-12-11 14:16:08 | 显示全部楼层
可以用compiler directive告知编译器不对齐的。
google pragma pack
具体参数不清楚了。

不过结果不应该错误阿。

顺便说一下,你直接用unsigned int关键字来写,
不利于程序的移植。

应该用typedef 来作,由 config 生成 config.h
发表于 2004-12-13 08:46:54 | 显示全部楼层
printf("bfType : %c\n",bfHeader.bfType_1);

为什么用 %c 来输出 short,结果是错的怪编译器吗?
 楼主| 发表于 2004-12-13 10:21:12 | 显示全部楼层
情况正好相反,printf("bfType : %c\n",bfHeader.bfType_1);
四个输出中只有这个接近正确,输出一个“B”(实际上是BM,这个数据区中存放的是两个字符BM),
其他的三个用无符号全部出错!
 楼主| 发表于 2004-12-14 10:55:10 | 显示全部楼层
自己顶一下!
发表于 2004-12-14 12:21:38 | 显示全部楼层
那个struct占16个字节是因为第二个字段是int型,一般要在内存中存放的时候要按4字节对齐,为了保证这一点,编译器在第一个short型(2字节)之后越过了2个字节然后安排第二个字段。这是很正常的现象。

你的数据到底错成什么样,出错的程序是什么样?说清楚一点大家可以帮你分析一下。

如果你非要说是编译器或系统的错,那可要三思了,除非能拿出确凿的证据
发表于 2004-12-14 18:02:06 | 显示全部楼层
用gcc对齐如下:
  1. [color=blue]
  2. typedef struct                        /**** BMP file header structure ****/
  3. {
  4.         unsigned short bfType;        /* Magic number for file */
  5.         unsigned int bfSize;                /* Size of file */
  6.         unsigned short bfReserved1;        /* Reserved */
  7.         unsigned short bfReserved2;        /* ... */
  8.         unsigned int bfOffBits;        /* Offset to bitmap data */
  9. } BITMAPFILEHEADER __attribute__((packed));
  10. [/color]
复制代码

就是attribute关键字,使用info gcc可查到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表