带结构和memcpy的C ++分段错误

时间:2016-05-11 17:18:50

标签: c++

您好我正在尝试这样做..我有一个分段错误,mi老师不让我使用malloc,可以在没有malloc的情况下做到这一点吗?

typedef unsigned char IPAddress[4]; 
typedef unsigned char MACAddress[6];


struct ethernet_frame {
  MACAddress host; 
  MACAddress me;
  uint16_t type ;
  unsigned char payload[1500];
} __attribute__((__packed__)); 
struct ethernet_frame frame; 



int send_to_ip(IPAddress ip, void *data) {

  struct ethernet_frame *packet = NULL ;
  MACAddress mymac = { 0 }; 
  get_my_mac_address(mymac); // this funcions is fine, and returns void 
  // this is the line that causes segmentation fault
  memcpy(packet->me, mymac, sizeof(mymac)); 


  / ... implementation continue  .../

2 个答案:

答案 0 :(得分:3)

packet指向NULL,因此取消引用它会导致未定义的行为,在这种情况下是分段错误。要在没有malloc的情况下执行此操作,只需创建一个本地对象:

struct ethernet_frame packet;
MACAddress mymac = { 0 }; 
get_my_mac_address(&mymac);
memcpy(&packet.me, &mymac, sizeof(mymac)); 

请注意,我还在函数调用中添加了&。它返回变量的地址,因此允许您将指针传递给本地对象。

答案 1 :(得分:0)

我认为问题出在这里:packet->me因为你试图引用一个未初始化的指针:packet。如果要将结构用作指针,则必须使用malloc或new在堆中分配其内存。

如果您不想使用malloc或new,则应创建一个局部变量。试试这个:

int send_to_ip(IPAddress ip, void *data) {

  struct ethernet_frame packet;
  MACAddress mymac = { 0 }; 
  get_my_mac_address(mymac); // this funcions is fine, and returns void 
  // this is the line that causes segmentation fault
  memcpy(packet.me, mymac, sizeof(mymac));