support pointer-to-slice
diff --git a/read_test.go b/read_test.go
index 11fab3a..404d04d 100644
--- a/read_test.go
+++ b/read_test.go
@@ -69,7 +69,7 @@
 }
 type cMultiS1 struct{ Multi []string }
 type cMultiS2 struct{ NonMulti nonMulti }
-type cMultiS3 struct{ MultiInt []int }
+type cMultiS3 struct{ PMulti *[]string }
 
 type cSubs struct{ Sub map[string]*cSubsS1 }
 type cSubsS1 struct{ Name string }
@@ -101,9 +101,8 @@
 	ok   bool
 }
 
-func newString(s string) *string {
-	return &s
-}
+func newString(s string) *string           { return &s }
+func newStringSlice(s ...string) *[]string { return &s }
 
 var readtests = []struct {
 	group string
@@ -188,6 +187,10 @@
 	// pointer
 	{"[section]", &cBasic{Section: cBasicS1{PName: nil}}, true},
 	{"[section]\npname=value", &cBasic{Section: cBasicS1{PName: newString("value")}}, true},
+	{"[m3]", &cMulti{M3: cMultiS3{PMulti: nil}}, true},
+	{"[m3]\npmulti", &cMulti{M3: cMultiS3{PMulti: newStringSlice()}}, true},
+	{"[m3]\npmulti=value", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value")}}, true},
+	{"[m3]\npmulti=value1\npmulti=value2", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value1", "value2")}}, true},
 	// section name not matched
 	{"\n[nonexistent]\nname=value", &cBasic{}, false},
 	// subsection name not matched
diff --git a/set.go b/set.go
index 6ca1051..7252b68 100644
--- a/set.go
+++ b/set.go
@@ -238,7 +238,14 @@
 	// vVal is either single-valued var, or newly allocated value within multi-valued var
 	var vVal reflect.Value
 	// multi-value if unnamed slice type
-	isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice
+	isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice ||
+		vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice
+	if isMulti && vVar.Kind() == reflect.Ptr {
+		if vVar.IsNil() {
+			vVar.Set(reflect.New(vVar.Type().Elem()))
+		}
+		vVar = vVar.Elem()
+	}
 	if isMulti && blank {
 		vVar.Set(reflect.Zero(vVar.Type()))
 		return nil