diff --git a/src/core/lib/iomgr/error.c b/src/core/lib/iomgr/error.c
index 7cdbe30198d8fb437b8ac7a2f29a2bdce9e59603..f0e294b6091cf4a241fd3deca45e58ac53e717f2 100644
--- a/src/core/lib/iomgr/error.c
+++ b/src/core/lib/iomgr/error.c
@@ -382,10 +382,12 @@ static grpc_error *copy_error_and_unref(grpc_error *in) {
 #ifdef GRPC_ERROR_REFCOUNT_DEBUG
     gpr_log(GPR_DEBUG, "%p create copying %p", out, in);
 #endif
-    memcpy(out, in, sizeof(*in) + in->arena_size * sizeof(intptr_t));
-    out->arena_capacity = new_arena_capacity;
-    gpr_atm_no_barrier_store(&out->error_string, 0);
     gpr_ref_init(&out->refs, 1);
+    gpr_atm_no_barrier_store(&out->error_string, 0);
+    size_t skip = sizeof(gpr_refcount) + sizeof(gpr_atm);
+    memcpy((void *)out + skip, (void *)in + skip,
+           sizeof(*in) + (in->arena_size * sizeof(intptr_t)) - skip);
+    out->arena_capacity = new_arena_capacity;
     ref_strs(out);
     ref_errs(out);
     GRPC_ERROR_UNREF(in);
diff --git a/src/core/lib/iomgr/error_internal.h b/src/core/lib/iomgr/error_internal.h
index fb4814e41f232e78cd6575ad29f2d94130123db4..0718d31f232bb816912d647fa8d51236efe950f5 100644
--- a/src/core/lib/iomgr/error_internal.h
+++ b/src/core/lib/iomgr/error_internal.h
@@ -48,12 +48,12 @@ struct grpc_linked_error {
 
 struct grpc_error {
   gpr_refcount refs;
+  gpr_atm error_string;
   uint8_t ints[GRPC_ERROR_INT_MAX];
   uint8_t strs[GRPC_ERROR_STR_MAX];
   uint8_t times[GRPC_ERROR_TIME_MAX];
   uint8_t first_err;
   uint8_t last_err;
-  gpr_atm error_string;
   uint8_t arena_size;
   uint8_t arena_capacity;
   intptr_t arena[0];