这可能是一个愚蠢的问题,但仍然没有得到它。 我确实有一个char数组说 char arr [100]有一些数据
char arry[100] ---- some data;
int test;
memcpy(&test,array+4,sizeof(int))
这个memcpy会做什么 谢谢 SKP
答案 0 :(得分:4)
这在所谓的数据序列化中可能很有用。
说,如果有人将整数保存到文件中。
然后将文件作为字节流读入缓冲区(在您的情况下为arry
)。现在,您希望将这些字节转换为实际数据,例如在你的情况下,整数test
已经与偏移量4一起存储。
有几种方法可以做到这一点。一种是使用memcpy将字节复制到编译器将它们视为整数的区域。
所以回答你的问题:
memcpy(&test,array+4,sizeof(int))
...将复制sizeof(int)字节数,从array
的第4个字节开始到为变量test
分配的内存(类型为int
)。现在test
具有最初保存到arry
的整数值,可能使用以下代码:
memcpy(array+4, &original_int, sizeof(int))
这样做需要一些硬件和语言方面的知识。由于存在许多并发症,其中包括:
答案 1 :(得分:2)
它只是将元素array[4]
复制到变量test
。在32位计算机上sizeof(int)
= 4
。 memcpy
会将4
个字节复制到可以保存&test
个字节的地址4
。
答案 2 :(得分:2)
这将从int
的第4到第7个字节复制大约4个字节(取决于您的机器和编译器 - 您的arry
可能更大或更小)到整数test
答案 3 :(得分:1)
通常,C库函数 void * memcpy(void * str1,const void * str2,size_t n)从内存区域 str2 复制 n 字符到内存区域 str1 ,其中:
str1 - 这是指向要复制内容的目标数组的指针,类型转换为void *
类型的指针str2 - 这是指向要复制的数据源的指针,类型转换为void *
类型的指针n - 这是要复制的字节数
memcpy返回指向目标的指针,即str1
在你的情况下,是复制数组的内容,从array [4]指向的地址到sizeof(int)字节(在这种情况下是4字节,如果你有32位机器),地址指向通过测试
答案 4 :(得分:0)
根据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
有些问题可以帮助您理解整数的内存布局:
还有无端问题:在我的计算机上,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;
}