ZMQ\_MSG\_INIT\_DATA(3) 0MQ Manual ZMQ\_MSG\_INIT\_DATA(3)

# [NAME](#NAME)

zmq\_msg\_init\_data - initialise 0MQ message from a supplied buffer

# [SYNOPSIS](#SYNOPSIS)

**typedef void (zmq\_free\_fn) (void \*data, void \*hint);**

**int zmq\_msg\_init\_data (zmq\_msg\_t \*msg, void \*data, size\_t size, zmq\_free\_fn \*ffn, void \*hint);**

# [DESCRIPTION](#DESCRIPTION)

The *zmq\_msg\_init\_data()* function shall initialise the message object referenced by *msg* to represent the content referenced by the buffer located at address *data*, *size* bytes long. No copy of *data* shall be performed and 0MQ shall take ownership of the supplied buffer.

If provided, the deallocation function *ffn* shall be called once the data buffer is no longer required by 0MQ, with the *data* and *hint* arguments supplied to *zmq\_msg\_init\_data()*.

**Caution**

Never access *zmq\_msg\_t* members directly, instead always use the *zmq\_msg* family of functions.

**Caution**

The deallocation function *ffn* needs to be thread-safe, since it will be called from an arbitrary thread.

**Caution**

If the deallocation function is not provided, the allocated memory will not be freed, and this may cause a memory leak.

**Caution**

The functions *zmq\_msg\_init()*, *zmq\_msg\_init\_data()*, *zmq\_msg\_init\_size()* and *zmq\_msg\_init\_buffer()* are mutually exclusive. Never initialise the same *zmq\_msg\_t* twice.

# [RETURN VALUE](#RETURN_VALUE)

The *zmq\_msg\_init\_data()* function shall return zero if successful. Otherwise it shall return -1 and set *errno* to one of the values defined below.

# [ERRORS](#ERRORS)

**ENOMEM**

Insufficient storage space is available.

# [EXAMPLE](#EXAMPLE)

**Initialising a message from a supplied buffer**.

```
void my_free (void *data, void *hint)
{


    free (data);
}


    /*  ...  */
void *data = malloc (6);
assert (data);
memcpy (data, "ABCDEF", 6);
zmq_msg_t msg;
rc = zmq_msg_init_data (&msg, data, 6, my_free, NULL);
assert (rc == 0);
```

# [SEE ALSO](#SEE_ALSO)

[**zmq\_msg\_init\_size**(3)](/man/enterprise-packages/zeromq-nocurve/zmq_msg_init_size.3) [**zmq\_msg\_init\_buffer**(3)](/man/enterprise-packages/zeromq-nocurve/zmq_msg_init_buffer.3) [**zmq\_msg\_init**(3)](/man/enterprise-packages/zeromq-nocurve/zmq_msg_init.3) [**zmq\_msg\_close**(3)](/man/enterprise-packages/zeromq-nocurve/zmq_msg_close.3) [**zmq\_msg\_data**(3)](/man/enterprise-packages/zeromq-nocurve/zmq_msg_data.3) [**zmq\_msg\_size**(3)](/man/enterprise-packages/zeromq-nocurve/zmq_msg_size.3) [**zmq**(7)](/man/enterprise-packages/zeromq-nocurve/zmq.7)

# [AUTHORS](#AUTHORS)

This page was written by the 0MQ community. To make a change please read the 0MQ Contribution Policy at **http://www.zeromq.org/docs:contributing**.

10/08/2026 0MQ 4.3.5

---

Document: zmq_msg_init_data(3) from zeromq-nocurve 4.3.5-r7 (Chainguard OS)
Source: https://github.com/zeromq/libzmq
