【发布时间】:2015-04-09 16:19:30
【问题描述】:
这可能是个愚蠢的问题,但仍然没有得到它。 我确实有一个 char 数组说 char arr[100] 有一些数据
char arry[100] ---- some data;
int test;
memcpy(&test,array+4,sizeof(int))
这个 memcpy 会做什么 谢谢 SKP
【问题讨论】:
标签: c
这可能是个愚蠢的问题,但仍然没有得到它。 我确实有一个 char 数组说 char arr[100] 有一些数据
char arry[100] ---- some data;
int test;
memcpy(&test,array+4,sizeof(int))
这个 memcpy 会做什么 谢谢 SKP
【问题讨论】:
标签: c
这在所谓的数据序列化中可能很有用。
假设有人将整数保存到文件中。
然后您将文件作为字节流读入缓冲区(在您的情况下为arry)。现在您想将这些字节转换为真实数据,例如在您的情况下,整数 test 以偏移量 4 存储。
有几种方法可以做到这一点。一种是使用memcpy 将字节复制到编译器将它们视为整数的区域。
所以回答你的问题:
memcpy(&test,array+4,sizeof(int))
...将从array 的第4 个字节开始复制sizeof(int) 字节数到为变量test(类型为int)分配的内存中。现在test 有了原来保存到arry 中的整数值,可能使用以下代码:
memcpy(array+4, &original_int, sizeof(int))
这样做需要一些硬件和语言知识。由于有很多并发症,其中:
【讨论】:
它只是将元素array[4] 复制到变量test。在 32 位机器上 sizeof(int) = 4。 memcpy 会将4 字节复制到地址&test,该地址可以保存4 字节。
【讨论】:
这会将arry 的第 4 到第 7 个字节中的 4 个字节(取决于您的机器和编译器 - 您的 int 可能更大或更小)复制到整数 test 中。
【讨论】:
一般C库函数void *memcpy(void *str1,const void *str2,size_t n)从内存区域str2复制n个字符strong> 到内存区域 str1,其中:
str1 – 这是指向要复制内容的目标数组的指针,类型转换为 void* 类型的指针
str2 -- 这是指向要复制的数据源的指针,类型转换为 void* 类型的指针
n -- 这是要复制的字节数
memcpy 返回一个指向目的地的指针,即 str1
在您的情况下,将数组的内容从 array[4] 指向的地址复制到 sizeof (int) 字节(在这种情况下为 4 字节,如果您有 32 位机器),地址指向通过测试
【讨论】:
根据memcpy()的文档:
void * memcpy ( void * destination, const void * source, size_t num );将
num字节的值从source指向的位置直接复制到destination指向的内存块。
在你的情况下:
num=sizeof(int)
destination=&test 指向测试的指针source=&array[4]指向char数组的第四个元素的指针array
因此,如果sizeof(int)==4 它将复制array[4]、array[5]、array[6] 和array[7] 到test
有一些问题可以帮助你理解整数的内存布局:
endianless 也有一个问题:在我的电脑上,array[4] 对应于最低有效字节。
因此,如果 array[7]=0x80 和 array4]=array[5]=array[6]=0x00 则 test 将包含 00000080 和 test 将值 -2^31。
如果 array[7]=0x2A 和 array[5]=array[6]=array[4]=0x00 则 test 将包含 2A000000 和 test 将值 42(即 0x0000002A)。
这是gcc main.c -o main要编译的测试代码
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]){
char array[100];
int test;
printf("sizeof(int) is %ld\n",sizeof(int));
array[4]=0x00;
array[5]=0;
array[6]=0;
array[7]=0x80;
memcpy(&test,&array[4],sizeof(int));
printf("test worth %d or(hexa) %x\n",test,test);
array[4]=0x2A;
array[5]=0;
array[6]=0;
array[7]=0x00;
memcpy(&test,&array[4],sizeof(int));
printf("test worth %d or(hexa) %x\n",test,test);
return 0;
}
【讨论】: