我试图将以下字符串数组传递给函数:
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 *
您可以清楚地看到,以前融合在一起的字符串现在完全丢失了,对于为什么我完全一无所知。
答案 0 :(得分:11)
您在L"test"
之后和L"this"
之后忘记了逗号。因此,编译器将相邻字符串文字"test"
和"="
视为单个字符串,并将相邻字符串文字"this"
和"is"
视为单个字符串。您可以在调试器输出中看到这一点。因此,该数组实际上有14个元素,而不是16个。