首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

结构体中的字节转换有关问题

2012-03-07 
结构体中的字节转换问题void *__constant_c_and_count_memset(void *s, unsigned long pattern,246size_t

结构体中的字节转换问题
void *__constant_c_and_count_memset(void *s, unsigned long pattern,
246 size_t count)
247 {
248 switch (count) {
249 case 0:
250 return s;
251 case 1:
252 *(unsigned char *)s = pattern & 0xff;
253 return s;
254 case 2:
255 *(unsigned short *)s = pattern & 0xffff;
256 return s;
257 case 3:
258 *(unsigned short *)s = pattern & 0xffff;
259 *((unsigned char *)s + 2) = pattern & 0xff;
260 return s;
261 case 4:
262 *(unsigned long *)s = pattern;
263 return s;
264 }
我想问的是,在case3的时候,那句是如何理解的,它的目标是要把这个弄成是3个字节的数据,那它那样做的作用是什么???

[解决办法]
指针加1,代表地址增加其所指向的类型在内存中占得字节数,
[解决办法]
这段代码是根据传进来的count参数值来决定参数pattern需要写入到s所指向内存里的字节数.

如pattern = 0x12345678.(unsigned long型, 假设sizeof(unsigned long)=4), 
case为1时,将pattern将最低字节上的内容复制到s中, 调用函数后,
*(unsigned char *)s=0x78;
case为2时,将pattern将最低两个字节上的内容复制到s中, 调用函数后,
*(unsigned short *)s=0x5678;
case为3时,将pattern将最低两个字节上的内容复制到s中, 调用函数后,
*(unsigned short *)s=0x5678;
*((unsigned char *)s + 2)=0x34.
如果s所指向的地址原先已经清零的情况下,*(unsigned long *)s=0x345678.

C/C++ code
void *__constant_c_and_count_memset(void *s, unsigned long pattern,size_t count){    switch (count) {        case 0:            return s;        case 1:            *(unsigned char *)s = pattern & 0xff;            return s;        case 2:            *(unsigned short *)s = pattern & 0xffff;            return s;        case 3:              *(unsigned short *)s = pattern & 0xffff;            *((unsigned char *)s + 2) = pattern & 0xff;            return s;        case 4:            *(unsigned long *)s = pattern;            return s;}
[解决办法]
探讨
*((unsigned char *)s + 2)=0x34.这句是咋来的呀!指针s又不是指向pattern这个数,而是指向其他地址的嘛?

热点排行
Bad Request.