这可能是一个愚蠢的问题,但我还是没有理解。 我有一个字符数组,例如 char arr[100],其中包含一些数据。
char arry[100] ---- some data;
int test;
memcpy(&test,array+4,sizeof(int))
这个memcpy会做什么?谢谢。SKP
这可能是一个愚蠢的问题,但我还是没有理解。 我有一个字符数组,例如 char arr[100],其中包含一些数据。
char arry[100] ---- some data;
int test;
memcpy(&test,array+4,sizeof(int))
这个memcpy会做什么?谢谢。SKP
arry
)中作为一系列字节流。现在你想将这些字节转换成真正的数据,例如在你的情况下被存储在偏移量4处的整数test
。 memcpy(&test,array+4,sizeof(int))
这段代码会从array
的第4个字节开始,拷贝sizeof(int)
个字节到为变量test
(类型为int
)分配的内存中。现在,test
中保存了最初保存在array
中的整数值,可能是使用以下代码保存的:
memcpy(array+4, &original_int, sizeof(int))
要做到这一点需要一些硬件和语言方面的知识。其中有许多复杂的问题,包括:
它只是将元素array[4]
复制到变量test
中。在32位机器上,sizeof(int)
= 4
。 memcpy
将会复制4
字节到地址&test
,这个地址可以容纳4
个字节。
arry
的第4个到第7个字节(取决于您的机器和编译器 - 您的int
可能更大或更小)复制大约4个字节到整数test
中。memcpy()
的文档:
在您的情况下:
void * memcpy ( void * destination, const void * source, size_t num );
Copies the values of
num
bytes from the location pointed bysource
directly to the memory block pointed bydestination
.
array[7]=0x80
并且array[4]=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;
}
一般情况下,C库函数void *memcpy(void *str1,const void *str2,size_t n)从内存区域str2复制n个字符到内存区域str1,其中:
str1 – 这是指向目标数组的指针,将其类型转换为void*类型的指针
str2 -- 这是指向要复制数据源的指针,将其类型转换为void*类型的指针
n -- 这是要复制的字节数
memcpy返回一个指向目标的指针,即str1
在您的情况下,将从数组[4]所指向的地址开始,复制数组的内容,直到sizeof(int)字节(在这种情况下为4字节,如果您有32位机器),并将其复制到test所指向的地址。