在C语言中将整数添加到字符数组中

7

这可能是一个愚蠢的问题,但我还是没有理解。 我有一个字符数组,例如 char arr[100],其中包含一些数据。

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

这个memcpy会做什么?谢谢。SKP

5个回答

5
这可能在所谓的数据序列化中很有用。
比如,如果有人把一个整数保存到文件中。
然后你将文件读取到缓冲区(arry)中作为一系列字节流。现在你想将这些字节转换成真正的数据,例如在你的情况下被存储在偏移量4处的整数test
有几种方法可以做到这一点。其中一种是使用memcpy将字节复制到编译器将其视为整数的区域。
因此,回答你的问题:
 memcpy(&test,array+4,sizeof(int))

这段代码会从array的第4个字节开始,拷贝sizeof(int)个字节到为变量test(类型为int)分配的内存中。现在,test中保存了最初保存在array中的整数值,可能是使用以下代码保存的:

 memcpy(array+4, &original_int, sizeof(int))

要做到这一点需要一些硬件和语言方面的知识。其中有许多复杂的问题,包括:


2

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


1
第一句话本身是错误的,因为它暗示只有一个字节被复制,而实际上你后来澄清,元素4-7也被复制。 - Lee Daniel Crocker

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

1
根据memcpy()的文档:
void * memcpy ( void * destination, const void * source, size_t num );

Copies the values of num bytes from the location pointed by source directly to the memory block pointed by destination.

在您的情况下:
- `num` = `sizeof(int)` - `destination` = `&test`,指向 `test` 的指针 - `source` = `&array[4]`,指向字符数组 `array` 的第四个元素的指针
因此,如果 `sizeof(int)==4`,它将复制 `array[4]`、`array[5]`、`array[6]` 和 `array[7]` 到 `test`。
有一些问题可以帮助您理解整数的内存布局:
- int32 storage in memory - How is an integer stored in memory? 还有一个关于字节序的问题:在我的计算机上,`array[4]` 对应于最不重要的字节。
因此,如果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;
}

1

一般情况下,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所指向的地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接