我必须复制存储为数组的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)) ;
提前致谢!!!
答案 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字节数组。