如何在C中将一个数组的数据复制到另一个数组?

时间:2014-02-25 16:41:10

标签: c arrays pointers memcpy

我必须复制存储为数组的Mac地址,并将指针引用到另一个数组。我想进行交换但是,我不知道我是否正在复制。

uint8_t * custom_mac_store;
memcpy(custom_mac_store, ehdr->ether_shost, sizeof(ehdr->ether_shost));
memcpy(ehdr->ether_shost, ehdr->ether_dhost, sizeof(ehdr->ether_shost));
memcpy(ehdr->ether_dhost, custom_mac_store, sizeof(ehdr->ether_shost));

ehdr-> ether_shost是指一个48位长的Mac地址,以8位存储在6个数组中。

struct sr_ethernet_hdr
{
#ifndef ETHER_ADDR_LEN
#define ETHER_ADDR_LEN 6
#endif
    uint8_t  ether_dhost[ETHER_ADDR_LEN];    /* destination ethernet address */
    uint8_t  ether_shost[ETHER_ADDR_LEN];    /* source ethernet address */
    uint16_t ether_type;                     /* packet type ID */
} __attribute__ ((packed)) ;

提前致谢!!!

3 个答案:

答案 0 :(得分:2)

custom_mac_store是一个指针,而不是一个数组,你应该分配内存,执行以下操作:

uint8_t * custom_mac_store = malloc(sizeof(ehdr->ether_shost) * sizeof(uint8_t));

然后做memcpy

这样你可以擦除或覆盖ehdr-> ether_shost,但你已经将数组复制到了新数组。

@alk你是对的,你需要删除内存

uint8_t * custom_mac_store = malloc(sizeof(ehdr->ether_shost) * sizeof(uint8_t));

memcpy(custom_mac_store, ehdr->ether_shost, sizeof(ehdr->ether_shost));
memcpy(ehdr->ether_shost, ehdr->ether_dhost, sizeof(ehdr->ether_shost));
memcpy(ehdr->ether_dhost, custom_mac_store, sizeof(ehdr->ether_shost));

free(custom_mac_store); //< Destroys everything in the array
custom_mac_store = NULL; //< NULL must be defined in a macro preferanly DEFINE NULL 0

或者您可以使用c ++

uint8_t * custom_mac_store = new uint8_t[sizeof(ehdr->ether_shost)];

std::copy ( ehdr->ether_shost, ehdr->ether_shost+sizeof(ehdr->ether_shost), custom_mac_store );
    std::copy ( ehdr->ether_dhost, ehdr->ether_dhost+sizeof(ehdr->ether_shost), ehdr->ether_shost );
    std::copy ( custom_mac_store, custom_mac_store+sizeof(ehdr->ether_shost), ehdr->ether_dhost );

delete[] custom_mac_store; //< Destroys everything in the array

或者您可以使用堆栈而不是堆(这应该更快,只是不要破坏堆栈)

const std::size_t size_custom_mac_store = 48000;
uint8_t custom_mac_store[size_custom_mac_store]; //< The size must be either a const or a macro

std::copy ( ehdr->ether_shost, ehdr->ether_shost+sizeof(ehdr->ether_shost), custom_mac_store );
std::copy ( ehdr->ether_dhost, ehdr->ether_dhost+sizeof(ehdr->ether_shost), ehdr->ether_shost );
std::copy ( custom_mac_store, custom_mac_store+sizeof(ehdr->ether_shost), ehdr->ether_dhost );

delete[] custom_mac_store; //< Destroys everything in the array
祝你好运。

PS:喜欢内存管理,这是唯一的方式

答案 1 :(得分:2)

您可以将以太网长度定义为6,然后使用临时数组,只需执行以下memcpy

#define ETH_ALEN        6
uint8_t tmp[ETH_ALEN];
memcpy(tmp, eth->ether_shost, ETH_ALEN);
memcpy(eth->ether_shost, eth->ether_dhost, ETH_ALEN);
memcpy(eth->ether_dhost, tmp, ETH_ALEN);

答案 2 :(得分:2)

如果为临时缓冲区custom_mac_store分配了一些内存,它可能会有效。 就像它只是一个未初始化的指针等待导致崩溃。 您可以为其明确分配一些内存,也可以直接使用6字节数组。