题目

代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <stdio.h>
void show_short(short *p, int len) { printf("show_short:\n"); for (int i = 0; i < len; i ++) { printf("%x ", *p); p++; } printf("\n"); }
void show_long(long *p, int len) { printf("show_long:\n"); for (int i = 0; i < len; i ++) { printf("%x ", *p); p++; } printf("\n"); }
void show_double(double *p, int len) { printf("show_double:\n"); for (int i = 0; i < len; i ++) { printf("%x ", *p); p++; } printf("\n"); }
void test(void *p) { printf("\n"); show_short((short *) p, (sizeof (*p) + sizeof(short) - 1 ) / sizeof(short) ); show_long((long *) p, (sizeof (*p) + sizeof(long) - 1 ) / sizeof(long) ); show_double((double *) p, (sizeof (*p) + sizeof(double) - 1 ) / sizeof(double) ); }
int main() { short x1 = 0x7F; long x2 = 0x7F6f5f4f; double x3 = 0x7F6f5f4f; test(&x1); test(&x2); test(&x3); return 0; }
|
运行结果:
只在本机上运行的结果:
| 原类型 |
值 |
show_short() |
show_long() |
show_double() |
| short |
0x7f |
7f |
1390007f |
1390007f |
| long |
0x7f6f5f4f |
5f4f |
7f6f5f4f |
7f6f5f4f |
| double |
0x7f6f5f4f |
0 |
d3c00000 |
d3c00000 |
观察现象:
show_long() 和 show_double() 显示 short时, 发生指针越界 导致大端多了6个字符(小端机器), 而最小小端显示正确。
show_short() 显示long 和 double 时, 皆出错。
结论
强制类型指针转换, 会导致错误的结果。尽量不使用强制类型指针转换。