本帖最后由 jackz007 于 2021-11-25 01:45 编辑 #include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int a = 1677721600 ;
char * b = (char *)malloc(sizeof(int)) ; //b 指向新分配到的 4 字节内存
memcpy(b , & a , 4) ; //从变量 a 的内存地址向内存 b 复制 4 个字节,实际上就是执行 * b = a
printf("%d" , * b) ; //按整型数打印 * b 的值,注意,由于 b 是指向字符的指针,所以,打印的只是第一个字节的数值
}
1677721600 = 0x64 00 00 00,Intel CPU 采用小端(Little-Endian)编码,这 4 个字节在内存中的排列顺序是 00 00 00 64,打印的是第一个字节的值,自然就是 0 了。
如果 a = 100,那么 100 = 0x64,4 个字节为 00 00 00 64,这 4 个字节在内存中的排列顺序是 64 00 00 00,打印第一个字节,也就是打印 0x64,正好就是 100。
看看下面的代码及其运行结果也许可以帮助楼主加深理解:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int a = 1677721600 , i ;
char * b = (char *) malloc(sizeof(int)) ;
memcpy(b , & a , 4) ;
printf("a = %d = 0x%08x\n" , a , a) ;
printf("bytes : %02x" , b[0]) ;
for(i = 1 ; i < 4 ; i ++) printf(" %02x" , b[i]) ;
printf("\n") ;
printf("* b = %d\n" , * b) ;
a = 100 ;
memcpy(b , & a , 4) ;
printf("a = %d = 0x%08x\n" , a , a) ;
printf("bytes : %02x" , b[0]) ;
for(i = 1 ; i < 4 ; i ++) printf(" %02x" , b[i]) ;
printf("\n") ;
printf("* b = %d\n" , * b) ;
}
编译、运行实况:D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
a = 1677721600 = 0x64000000
bytes : 00 00 00 64
* b = 0
a = 100 = 0x00000064
bytes : 64 00 00 00
* b = 100
D:\00.Excise\C>
|