Я попытался передать в функцию следующий массив строк:
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 одинаковым. Однако программа неожиданно вылетела из-за segfault внутри функции processArray.
Естественно, я исследовал причину ошибки с помощью встроенного отладчика Visual Stud ios и обнаружил, что некоторые элементы внутри 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 *
Как вы можете ясно видеть, струны, которые раньше были соединены вместе, теперь полностью отсутствуют, и я совершенно не понимаю почему.