#include <stdio.h> #include <stdlib.h> int main() { //void *p_v = malloc(4 * sizeof(char)); void *p_v = calloc(4, sizeof(char)); char *p_str = (char *)p_v; //printf("p_str = %p\n", p_str); *(p_str + 3) = ""0""; int *p_num = (int *)p_v; //printf("p_num = %p\n", p_num); printf("*p_num = %d\n", *p_num); free(p_num); return 0; }
运行结果是805306368。
各位高手,问个问题,这个结果为什么不是48呀?
其中””0″”的值是48。
它不是按照下面操作的吗?
00000000 00000000 00000000 00110000
str[0] str[1] str[2] str[3]
解决方案:10分
这和int的内存格式有关系,
x86的cpu是little endian 就是在低字节地址低位数, 高字节存放高位数
char原因是只有1个字节,没有问题,就是从第到高 排列
上述例子的4个char
0x00 0x00 0x00 0x30
–>
但是int有4个字节,作为整体,低位数放在低字节的地址,高位数放在高字节的地址,
例如你有一个数0x11223344,在内存中是这样的 44 33 22 11
因此,。
x86的cpu是little endian 就是在低字节地址低位数, 高字节存放高位数
char原因是只有1个字节,没有问题,就是从第到高 排列
上述例子的4个char
0x00 0x00 0x00 0x30
–>
但是int有4个字节,作为整体,低位数放在低字节的地址,高位数放在高字节的地址,
例如你有一个数0x11223344,在内存中是这样的 44 33 22 11
因此,。
解决方案:5分
谷歌搜索大小端
解决方案:5分
#include <stdio.h> #include <stdlib.h> int get_sys_endian(void) { int a = 0x1234; char c = *(char*)&a; if (0x12 == c) { printf("big endian\n"); return 1; } else { printf("little endian\n"); return -1; } return 0; } int main(void) { int pos = 0; void *p_v = calloc(4, sizeof(char)); char *p_str = (char *)p_v; if (get_sys_endian() == 1) { pos = 3; } *(p_str + pos) = ""0""; int *p_num = (int *)p_v; printf("*p_num = %d\n", *p_num); free(p_num); return 0; }