鱼C论坛

 找回密码
 立即注册
查看: 608|回复: 4

[已解决]关于内存拷贝的问题

[复制链接]
发表于 2021-11-24 23:38:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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 }
最佳答案
2021-11-24 23:48:10
本帖最后由 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-24 23:39:03 | 显示全部楼层
a的范围在int中,为什么打印出来是0;当a等于100时,打印出来就是100.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-24 23:42:03 | 显示全部楼层
求教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-24 23:43:30 | 显示全部楼层
困扰了很久,麻烦大家帮忙看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-24 23:48:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表