在c中向char数组添加一个整数

时间:2015-04-09 16:19:31

标签: c

这可能是一个愚蠢的问题,但仍然没有得到它。     我确实有一个char数组说      char arr [100]有一些数据

 char arry[100] ---- some data;
 int test;
 memcpy(&test,array+4,sizeof(int))

这个memcpy会做什么 谢谢 SKP

5 个答案:

答案 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) = 4memcpy会将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]=0x80array4]=array[5]=array[6]=0x00test将包含00000080而test将值为-2 ^ 31.

如果array[7]=0x2Aarray[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;
}