Отсутствуют элементы строкового массива wchar_t - PullRequest
3 голосов
/ 05 августа 2020

Я попытался передать в функцию следующий массив строк:

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 *

Как вы можете ясно видеть, струны, которые раньше были соединены вместе, теперь полностью отсутствуют, и я совершенно не понимаю почему.

1 Ответ

11 голосов
/ 05 августа 2020

Вы забыли запятую после L"test" и после L"this". Поэтому компилятор обрабатывает соседние строковые литералы "test" и "=" как одну строку, а смежные строковые литералы "this" и "is" как одну строку. Вы можете увидеть это в выводе отладчика. Таким образом, на самом деле в массиве 14 элементов, а не 16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...