diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v
index 84fb9db0f5..b13af61b35 100644
--- a/vlib/v/gen/c/auto_str_methods.v
+++ b/vlib/v/gen/c/auto_str_methods.v
@@ -916,7 +916,8 @@ fn (mut g Gen) gen_str_for_struct(info ast.Struct, styp string, str_fn_name stri
 			funcprefix += 'isnil(it.${c_name(field.name)})'
 			funcprefix += ' ? _SLIT("nil") : '
 			// struct, floats and ints have a special case through the _str function
-			if sym.kind != .struct_ && !field.typ.is_int_valptr() && !field.typ.is_float_valptr() {
+			if sym.kind !in [.struct_, .alias] && !field.typ.is_int_valptr()
+				&& !field.typ.is_float_valptr() {
 				funcprefix += '*'
 			}
 		}
diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v
index 42fde59c49..ed08d1804c 100644
--- a/vlib/v/gen/c/cgen.v
+++ b/vlib/v/gen/c/cgen.v
@@ -5519,6 +5519,9 @@ fn (mut g Gen) struct_init(node ast.StructInit) {
 							|| sfield.typ.is_pointer()) && !sfield.typ.is_number() {
 							g.write('/* autoref */&')
 						}
+						if sfield.typ.is_ptr() && field_type_sym.kind == .alias {
+							g.write('&')
+						}
 						g.expr_with_cast(sfield.expr, sfield.typ, sfield.expected_type)
 					}
 				}
diff --git a/vlib/v/gen/c/str.v b/vlib/v/gen/c/str.v
index 604e14d1d4..fc9f1090e5 100644
--- a/vlib/v/gen/c/str.v
+++ b/vlib/v/gen/c/str.v
@@ -85,6 +85,9 @@ fn (mut g Gen) gen_expr_to_string(expr ast.Expr, etype ast.Type) {
 		g.expr(expr)
 		g.write(')')
 	} else if typ == ast.string_type {
+		if etype.is_ptr() {
+			g.write('*')
+		}
 		g.expr(expr)
 	} else if typ == ast.bool_type {
 		g.expr(expr)
diff --git a/vlib/v/tests/struct_with_reference_alias_fields.v b/vlib/v/tests/struct_with_reference_alias_fields.v
new file mode 100644
index 0000000000..564e388750
--- /dev/null
+++ b/vlib/v/tests/struct_with_reference_alias_fields.v
@@ -0,0 +1,13 @@
+type SS = string
+
+struct ST {
+	data &SS
+}
+
+fn test_struct_with_reference_alias_fields() {
+	mut val := ST{
+		data: &SS('hi')
+	}
+	println(val.data)
+	assert '$val.data' == 'hi'
+}