wchar_t字符串数组的成员丢失

时间:2020-08-05 07:11:21

标签: c++ arrays c string

我试图将以下字符串数组传递给函数:

const wchar_t *testTokens[] = { L"function",
                                L"(",
                                L"x",
                                L")",
                                L"{",
                                L"var",
                                L"test"
                                L"=",
                                L"\"",
                                L"this"
                                L"is",
                                L"a",
                                L"string",
                                L"\"",
                                L";",
                                L"}" };

有问题的函数如下所示:

processArray(const wchar_t **strings, unsigned int numStrings);

由于上面定义的数组正好有16个条目,因此我将numStrings设置为相同。但是,由于processArray函数内部存在段错误,程序意外崩溃。

自然地,我调查了使用调试器中内置的Visual Studio导致错误的原因,并且发现testTokes内部的某些元素在其定义之后“融合在一起”:

-       testTokens,16   0x00effba0 {0x00660f88 L"function", 0x00660b70 L"(", 0x00660c04 L"x", 0x00660c0c L")", 0x00660cec L"{", ...}    const wchar_t *[16]
+       [0]     0x00660f88 L"function"              const wchar_t *
+       [1]     0x00660b70 L"("                     const wchar_t *
+       [2]     0x00660c04 L"x"                     const wchar_t *
+       [3]     0x00660c0c L")"                     const wchar_t *
+       [4]     0x00660cec L"{"                     const wchar_t *
+       [5]     0x00660fb0 L"var"                   const wchar_t *
+       [6]     0x00660fbc L"test="                 const wchar_t *
+       [7]     0x00660cf4 L"\""                    const wchar_t *
+       [8]     0x00660cfc L"thisis"                const wchar_t *
+       [9]     0x00660d10 L"a"                     const wchar_t *
+       [10]    0x00660fe4 L"string"                const wchar_t *
+       [11]    0x00660cf4 L"\""                    const wchar_t *
+       [12]    0x00660d5c L";"                     const wchar_t *
+       [13]    0x00660d64 L"}"                     const wchar_t *
+       [14]    0xcccccccc <Error reading String.>  const wchar_t *
+       [15]    0x7f4af182 <Error reading String.>  const wchar_t *

然后我尝试为每个字符串手动添加空终止符:

const wchar_t *testTokens[] = { L"function\0",
                                L"(\0",
                                L"x\0",
                                L")\0",
                                L"{\0",
                                L"var\0",
                                L"test\0"
                                L"=\0",
                                L"\"\0",
                                L"this\0"
                                L"is\0",
                                L"a\0",
                                L"string\0",
                                L"\"\0",
                                L";\0",
                                L"}\0" };

这导致以下内存布局:

-       testTokens,16   0x0055fe30 {0x006a0f88 L"function", 0x006a0b70 L"(", 0x006a0c04 L"x", 0x006a0c0c L")", 0x006a0cec L"{", ...}    const wchar_t *[16]
+       [0]     0x006a0f88 L"function"              const wchar_t *
+       [1]     0x006a0b70 L"("                     const wchar_t *
+       [2]     0x006a0c04 L"x"                     const wchar_t *
+       [3]     0x006a0c0c L")"                     const wchar_t *
+       [4]     0x006a0cec L"{"                     const wchar_t *
+       [5]     0x006a0fb0 L"var"                   const wchar_t *
+       [6]     0x006a0fbc L"test"                  const wchar_t *
+       [7]     0x006a0cf4 L"\""                    const wchar_t *
+       [8]     0x006a0cfc L"this"                  const wchar_t *
+       [9]     0x006a0d10 L"a"                     const wchar_t *
+       [10]    0x006a0fe4 L"string"                const wchar_t *
+       [11]    0x006a0cf4 L"\""                    const wchar_t *
+       [12]    0x006a0d5c L";"                     const wchar_t *
+       [13]    0x006a0d64 L"}"                     const wchar_t *
+       [14]    0xcccccccc <Error reading String.>  const wchar_t *
+       [15]    0x5d1ee42e <Error reading String.>  const wchar_t *

您可以清楚地看到,以前融合在一起的字符串现在完全丢失了,对于为什么我完全一无所知。

1 个答案:

答案 0 :(得分:11)

您在L"test"之后和L"this"之后忘记了逗号。因此,编译器将相邻字符串文字"test""="视为单个字符串,并将相邻字符串文字"this""is"视为单个字符串。您可以在调试器输出中看到这一点。因此,该数组实际上有14个元素,而不是16个。

相关问题