使用memcpy从缓冲区复制到结构数组时的SEGFAULT

时间:2018-01-31 18:56:33

标签: c arrays struct malloc memcpy

我有以下结构定义

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
#  Wait for next request from client
message = socket.recv_pyobj()
print("%s: %s" % (message.get(1)[0], message.get(1)[1]))
time.sleep(1)

#  Send reply back to client

socket.send_pyobj({1:[message.get(1)[0], message.get(1)[1]]})

typedef struct { uint16_t type; uint16_t name_offset; uint32_t data_offset; uint32_t size; }node; 按预期返回12个字节。

sizeof(node)

在我当前的测试中,nodecount是96,并且为节点分配的内存是预期的1152。 (通过_msize测试)

我想从我在偏移量为20的缓冲区中memcpy进入这个新节点数组(这是我崩溃的地方)。我已经确认0x20(含)-0x4A0(不包括)是这个数组的正确结构。

node *nodes = (node*)malloc(sizeof(node)*nodecount);

缓冲区看起来像这样

memcpy(nodes,buffer[0x20],sizeof(node)*nodecount)

1 个答案:

答案 0 :(得分:5)

使用memcpy的正确方法是(根据给出的描述)(我在偏移32处的缓冲区到这个新节点数组

memcpy(nodes,buffer+32,sizeof(node)*nodecount);

memcpy(nodes,&buffer[0x20],sizeof(node)*nodecount);

之前您没有通过该地址,而是您自己传递了该值。您试图访问一些您不应导致分段错误的内存位置。