Массив a
является постоянным массивом символов, он полностью инициализируется во время компиляции, а также получает адрес памяти для запоминания компилятором, поэтому он может распадаться на указатель в шаблоне.
Но p
является указателем к постоянному массиву символов, но сам указатель не является константой времени компиляции и может быть изменен для указания на другие строки, и это not инициализируется во время компиляции, но либо во время соединения (что происходит после компиляции), либо когда программа загружается в память. Адрес p
известен во время компиляции, но не адрес строкового литерала p
указывает на.
Чтобы развернуть по причине, что адрес строкового литерала не является известная во время компиляции, потому что она помещается в специальный сегмент для чтения с помощью генератора кода компилятора, и этот сегмент только для чтения затем объединяется с сегментами только для чтения из других блоков перевода при связывании. Вот почему окончательный адрес строкового литерала не может быть известен до момента связывания (как можно раньше).
Попробуйте ByteArrayOutputStream
. Можно использовать write( byte[] )
, и это вырастет по мере необходимости.