我有以下结构定义
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)
答案 0 :(得分:5)
使用memcpy
的正确方法是(根据给出的描述)(我在偏移32处的缓冲区到这个新节点数组)
memcpy(nodes,buffer+32,sizeof(node)*nodecount);
或
memcpy(nodes,&buffer[0x20],sizeof(node)*nodecount);
之前您没有通过该地址,而是您自己传递了该值。您试图访问一些您不应导致分段错误的内存位置。