|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1 #include <arpa/inet.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 void main()
6 {
7 int a = 1677721600;
8 char *b = (char *)malloc(sizeof(int));
9 memcpy(b,&a,4);
10 printf("%d",*b); //b=0
11 }
本帖最后由 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>
复制代码
|
|