在c中向字符数组添加整数
这也许是个愚蠢的问题,但我还是不明白。 我有一个字符数组 char arr[100]具有一些数据在c中向字符数组添加整数,c,C,这也许是个愚蠢的问题,但我还是不明白。 我有一个字符数组 char arr[100]具有一些数据 char arry[100] ---- some data; int test; memcpy(&test,array+4,sizeof(int)) 这个memcpy会做什么 谢谢 SKP它只需将元素数组[4]复制到变量test。在32位机器上sizeof(int)=4memcpy会将4字节复制到可容纳4字节的地址&test。这可能会复制4个字节(取决于您的机器和编译器-int可能更
char arry[100] ---- some data;
int test;
memcpy(&test,array+4,sizeof(int))
这个memcpy会做什么
谢谢
SKP它只需将元素
数组[4]
复制到变量test
。在32位机器上sizeof(int)
=4
memcpy
会将4
字节复制到可容纳4
字节的地址&test
。这可能会复制4个字节(取决于您的机器和编译器-int
可能更大或更小)从的第4到第7个字节排列成整数test
这在所谓的数据序列化中可能很有用
比如说,如果有人将一个整数保存到一个文件中
然后将文件作为字节流读入缓冲区(arry
)。现在,您需要将这些字节转换为实际数据,例如,在您的情况下,integertest
与偏移量4一起存储
有几种方法可以做到这一点。一种是将字节复制到编译器将其视为整数的区域
所以要回答你的问题:
memcpy(&test,array+4,sizeof(int))
…将从数组
的第4个字节开始,将sizeof(int)字节数复制到分配给变量测试
(类型为int
)的内存中。现在,test
具有最初保存到arry
中的整数值,可能使用以下代码:
memcpy(array+4, &original_int, sizeof(int))
这样做需要一些硬件和语言知识。因为有很多复杂情况,其中:
- 以整数表示李>
- )李>
根据以下文件:
将num
字节的值从source
指向的位置直接复制到destination
指向的内存块
就你而言:
num
=sizeof(int)
目的地
=测试
指向测试的指针
source
=数组[4]
指向char数组第四个元素的指针
因此,如果sizeof(int)==4
它将数组[4]
,数组[5]
,数组[6]
和数组[7]
复制到测试中
有一些问题可以帮助您理解整数的内存布局:
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
将包含2000000,而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;
}
#包括
#包括
int main(int argc,char*argv[]){
字符数组[100];
智力测验;
printf(“sizeof(int)是%ld\n”,sizeof(int));
数组[4]=0x00;
数组[5]=0;
数组[6]=0;
数组[7]=0x80;
memcpy(&test,&array[4],sizeof(int));
printf(“测试值%d或(hexa)%x\n”,测试,测试);
数组[4]=0x2A;
数组[5]=0;
数组[6]=0;
数组[7]=0x00;
memcpy(&test,&array[4],sizeof(int));
printf(“测试值%d或(hexa)%x\n”,测试,测试);
返回0;
}
通常,C库函数void*memcpy(void*str1,const void*str2,size\t n)将n字符从存储区str2复制到存储区str1,其中:
str1–这是指向要复制内容的目标数组的指针,类型转换为void类型的指针*
str2——这是指向要复制的数据源的指针,类型转换为void类型的指针*
n——这是要复制的字节数
memcpy返回指向目标的指针,即str1
在您的情况下,将复制数组的内容,从数组[4]指向的地址复制到sizeof(int)字节(如果您有32位计算机,则在本例中为4字节),编辑后删除test指向的地址。第一句话本身是错误的,因为它意味着只有一个字节被复制,而事实上,正如您稍后澄清的那样,元素4-7被复制。
#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;
}