【问题标题】:adding an integer to a char array in c在c中将整数添加到char数组
【发布时间】: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


    【解决方案1】:

    这在所谓的数据序列化中可能很有用。

    假设有人将整数保存到文件中。

    然后您将文件作为字节流读入缓冲区(在您的情况下为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))
    

    这样做需要一些硬件和语言知识。由于有很多并发症,其中:

    【讨论】:

      【解决方案2】:

      它只是将元素array[4] 复制到变量test。在 32 位机器上 sizeof(int) = 4memcpy 会将4 字节复制到地址&test,该地址可以保存4 字节。

      【讨论】:

      • 编辑后删除。第一句话本身是错误的,因为它暗示只有一个字节被复制,而实际上元素 4-7 被复制,正如您稍后澄清的那样。
      【解决方案3】:

      这会将arry 的第 4 到第 7 个字节中的 4 个字节(取决于您的机器和编译器 - 您的 int 可能更大或更小)复制到整数 test 中。

      【讨论】:

        【解决方案4】:

        一般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 位机器),地址指向通过测试

        【讨论】:

          【解决方案5】:

          根据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]=0x80array4]=array[5]=array[6]=0x00test 将包含 00000080 和 test 将值 -2^31。

          如果 array[7]=0x2Aarray[5]=array[6]=array[4]=0x00test 将包含 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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-03-07
            • 2013-08-18
            • 2016-07-15
            • 2022-01-18
            • 2011-04-03
            • 1970-01-01
            相关资源
            最近更新 更多