Странно, зачем вообще разрешать этому фрагменту компилироваться? Ну да ладно.
char* symbolArrayNoSize = new char[];
cout << symbolArrayNoSize << endl;Имеем массив символов неопределённого размера. В результате отображения на экране скорее всего будет выводиться весь хлам до первого символа '\0'. Запуск фрагмента подтвердил предположение:
¤¤¤¤ллллллллю■ю■Предлагаю вашему вниманию следующий фрагмент:
const int ARRAY_LENGTH = 5;
char* symbolArray = new char[ARRAY_LENGTH];
strncpy(symbolArray, "abcdefghijklmnop", ARRAY_LENGTH);
cout << symbolArray << endl;Казалось бы, здесь всё по фэн-шую: размер массива задали, в него скопировали именно необходимое количество символов и вывели на экран. Не тут-то было:
abcde¤¤¤¤иR╕ЧиRШ¤¤¤¤Из этого результата один прискорбный вывод: задаёшь размер массива явным образом - всё равно содержимое будет выводиться до первого встречного '\0'. Так спрашивается, какого хрена задавать размер массива, если он всё равно сомнительную роль играет? Где логика-то?
const int ARRAY_LENGTH = 5;
char* symbolArray = new char[ARRAY_LENGTH + 1];
// Length of useful data is ARRAY_LENGTH plus 1 symbol '\0',// meaning the end of the string.
symbolArray[ARRAY_LENGTH] = '\0';
// Put the delimiter of the string on its proper position
strncpy(symbolArray, "abcdefghijklmnop", ARRAY_LENGTH);
cout << symbolArray << endl;И только в результате вот таких манипуляций получаем ожидаемый результат:
abcdeУдобно? Не очень. Используйте обёрточные классы для С-строк. Не выделывайтесь.
Компилировал в Visual Studio 2010.