There are 2 problems with your memcpy:
1. src rows are not necessarily continuous
Consider:
#define x 2
float src_row_0[x] = { 0.0f, 0.1f };
float src_row_1[x] = { 1.0f, 1.1f };
float * src_rows[x] = { src_row_0, src_row_1 };
float ** src = src_rows;
There is no guarantee that rows are next to each other in memory. So you cannot copy bytes with single memcpy. Same applies even if you allocated srcrows with malloc.
You'll need to copy each row separately.
2. Size x is not enough to copy all bytes
memcpy copies number of bytes, not number of elements. Single float variable is usually more than 1 byte in size. Simply passing x to memcpy is not enough. You'll need to multiply each number of items by size of an single element.
Fixing the copy
Corrected copy would look something like this:
for(int i=0; i<x; ++i) {
memcpy(&dst[i], src[i], x * sizeof(float));
}
Example on Ideone.
float**is not contiguous in memory. You can't use memcpy only once. Try to understand what**means. You can do this with memcpyxtimes