Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中向字符数组添加整数_C - Fatal编程技术网

在c中向字符数组添加整数

在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 arr[100]具有一些数据

 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
)。现在,您需要将这些字节转换为实际数据,例如,在您的情况下,integer
test
与偏移量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;
}