wuxianbiao 发表于 2021-11-24 23:38:18

关于内存拷贝的问题

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 }

wuxianbiao 发表于 2021-11-24 23:39:03

a的范围在int中,为什么打印出来是0;当a等于100时,打印出来就是100.

wuxianbiao 发表于 2021-11-24 23:42:03

求教。

wuxianbiao 发表于 2021-11-24 23:43:30

困扰了很久,麻烦大家帮忙看看。

jackz007 发表于 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)                  ;
      for(i = 1 ; i < 4 ; i ++) printf(" %02x" , b) ;
      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)                  ;
      for(i = 1 ; i < 4 ; i ++) printf(" %02x" , b) ;
      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>
页: [1]
查看完整版本: 关于内存拷贝的问题