diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c
index 34c4970..19a9b7c 100644
--- a/gi/pygi-argument.c
+++ b/gi/pygi-argument.c
@@ -1145,6 +1145,8 @@ _pygi_argument_from_object (PyObject   *object,
             /* we handle arrays that are really strings specially, see below */
             if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8)
                item_size = 1;
+            else if (g_type_info_get_array_type (type_info) == GI_ARRAY_TYPE_C)
+               item_size = _pygi_g_type_tag_size (g_type_info_get_tag (item_type_info));
             else
                item_size = sizeof (GIArgument);
 
@@ -1183,7 +1185,10 @@ _pygi_argument_from_object (PyObject   *object,
                     goto array_item_error;
                 }
 
-                g_array_insert_val (array, i, item);
+                if (g_type_info_get_array_type (type_info) == GI_ARRAY_TYPE_C)
+                    memcpy (array->data + i * item_size, &item, item_size);
+                else
+                    g_array_insert_val (array, i, item);
                 continue;
 
 array_item_error:
@@ -1197,7 +1202,12 @@ array_item_error:
             }
 
 array_success:
-            arg.v_pointer = array;
+            if (g_type_info_get_array_type (type_info) == GI_ARRAY_TYPE_C) {
+                /* append 0 item */
+                arg.v_pointer = g_array_free (array, FALSE);
+            } else {
+                arg.v_pointer = array;
+            }
 
             g_base_info_unref ( (GIBaseInfo *) item_type_info);
             break;
diff --git a/tests/test_gi.py b/tests/test_gi.py
index 30511d0..8c9a16b 100644
--- a/tests/test_gi.py
+++ b/tests/test_gi.py
@@ -2030,6 +2030,9 @@ class TestPythonGObject(unittest.TestCase):
         def do_vfunc_caller_allocated_out_parameter(self):
             return self.return_for_caller_allocated_out_parameter
 
+        def do_vfunc_array_out_parameter(self):
+            return [42.42, 3.14, 9.12]
+
     class SubObject(GIMarshallingTests.SubObject):
         def __init__(self, int):
             GIMarshallingTests.SubObject.__init__(self)
@@ -2093,6 +2096,15 @@ class TestPythonGObject(unittest.TestCase):
         object_.method_with_default_implementation(84)
         self.assertEqual(object_.props.int, 84)
 
+    def test_vfunc_array_out(self):
+        object_ = self.Object(int=42)
+        a = object_.vfunc_array_out_parameter()
+
+        print(a)
+        self.assertEqual(len(a), 2)
+        self.assertAlmostEqual(a[0], 42.42, places=5)
+        self.assertAlmostEqual(a[1], 3.14, places=5)
+
     def test_vfunc_return_ref_count(self):
         obj = self.Object(int=42)
         ref_count = sys.getrefcount(obj.return_for_caller_allocated_out_parameter)
