Use std::string instead of a huge array for storing literal strings.
diff --git a/source/text.cpp b/source/text.cpp
index bd74769..b440552 100644
--- a/source/text.cpp
+++ b/source/text.cpp
@@ -112,22 +112,19 @@
     if (len < 2 || textValue[0] != '"' || textValue[len - 1] != '"')
       return SPV_FAILED_MATCH;
     bool escaping = false;
-    size_t write_index = 0;
     for (const char* val = textValue + 1; val != textValue + len - 1; ++val) {
       if ((*val == '\\') && (!escaping)) {
         escaping = true;
       } else {
         // Have to save space for the null-terminator
-        if (write_index >= sizeof(pLiteral->value.str) - 1)
+        if (pLiteral->str.size() >= SPV_LIMIT_LITERAL_STRING_BYTES_MAX)
           return SPV_ERROR_OUT_OF_MEMORY;
-        pLiteral->value.str[write_index] = *val;
+        pLiteral->str.push_back(*val);
         escaping = false;
-        ++write_index;
       }
     }
 
     pLiteral->type = SPV_LITERAL_TYPE_STRING;
-    pLiteral->value.str[write_index] = '\0';
   } else if (numPeriods == 1) {
     double d = std::strtod(textValue, nullptr);
     float f = (float)d;
@@ -364,10 +361,10 @@
       // NOTE: Special case for extended instruction library import
       if (SpvOpExtInstImport == pInst->opcode) {
         const spv_ext_inst_type_t ext_inst_type =
-            spvExtInstImportTypeGet(literal.value.str);
+            spvExtInstImportTypeGet(literal.str.c_str());
         if (SPV_EXT_INST_TYPE_NONE == ext_inst_type) {
           return context->diagnostic()
-                 << "Invalid extended instruction import '" << literal.value.str
+                 << "Invalid extended instruction import '" << literal.str
                  << "'";
         }
         if (auto error = context->recordIdAsExtInstImport(pInst->words[1],
@@ -375,7 +372,7 @@
           return error;
       }
 
-      if (context->binaryEncodeString(literal.value.str, pInst))
+      if (context->binaryEncodeString(literal.str.c_str(), pInst))
         return SPV_ERROR_INVALID_TEXT;
     } break;
     case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
diff --git a/source/text.h b/source/text.h
index f8b9551..5c5dc56 100644
--- a/source/text.h
+++ b/source/text.h
@@ -54,11 +54,8 @@
     uint64_t u64;
     float f;
     double d;
-    // Allow room for the null terminator
-    // TODO(dneto): This is a very large array.  We should use a
-    // different kind of container.
-    char str[SPV_LIMIT_LITERAL_STRING_BYTES_MAX + 1];
   } value;
+  std::string str;  // Special field for literal string.
 } spv_literal_t;
 
 // Functions
diff --git a/test/TextLiteral.cpp b/test/TextLiteral.cpp
index 62a2dbe..301ad6c 100644
--- a/test/TextLiteral.cpp
+++ b/test/TextLiteral.cpp
@@ -112,7 +112,7 @@
 
   ASSERT_EQ(SPV_SUCCESS, spvTextToLiteral(std::get<0>(GetParam()), &l));
   EXPECT_EQ(SPV_LITERAL_TYPE_STRING, l.type);
-  EXPECT_STREQ(std::get<1>(GetParam()), l.value.str);
+  EXPECT_EQ(std::get<1>(GetParam()), l.str);
 }
 
 INSTANTIATE_TEST_CASE_P(
@@ -151,7 +151,7 @@
   std::string good_long = std::string("\"") + unquoted + "\"";
   EXPECT_EQ(SPV_SUCCESS, spvTextToLiteral(good_long.data(), &l));
   EXPECT_EQ(SPV_LITERAL_TYPE_STRING, l.type);
-  EXPECT_STREQ(unquoted.data(), l.value.str);
+  EXPECT_EQ(unquoted.data(), l.str);
 }
 
 TEST(TextLiteral, GoodUTF8String) {
@@ -161,7 +161,7 @@
   spv_literal_t l;
   EXPECT_EQ(SPV_SUCCESS, spvTextToLiteral(good_long.data(), &l));
   EXPECT_EQ(SPV_LITERAL_TYPE_STRING, l.type);
-  EXPECT_STREQ(unquoted.data(), l.value.str);
+  EXPECT_EQ(unquoted.data(), l.str);
 }
 
 // A test case for parsing literal numbers.