То, что вы написали, не является C ++, и оно определенно не разрешено.
Правильный путь:
const char * a = "01234"; // pointer to array of six const chars.
char b[] = "01234"; // array of six chars
Вы можете только читать значения a[0]
до a[5]
, но никогда не меняйте их.Вы можете изменить значения b[i]
для i в диапазоне от 0 до 5, но не устанавливайте для b[5]
значение, отличное от нуля.
Любой доступ, читайте или записать в a[i]
или b[i]
с i
больше пяти равно неопределенное поведение и почти наверняка самоубийство.
В случае a
строковый литералобычно живет в глобальной части памяти, доступной только для чтения.С другой стороны, b
- это просто автоматический массив в локальной области видимости, который инициализируется указанными шестью символами (включая нулевой терминал).
И наоборот, если по каким-то таинственным причинам у вас есть уже по адресу какой-то действительной области памяти, вы можете нанести разного рода хаос:
char * evil = use_dastardly_exploit();
memcpy(evil, my_leet_shellcode, 1024);
Действительно, C и C ++ позволяют свободно перемещаться по виртуальной памяти вашего процесса, но вы можете получить выстрелв любой момент!
(Для вас второй вопрос - хорошо написать a = "56789";
, но a
будет указывать на другую строку, а не изменять исходную (а a
все равно должно бытьтипа const char *
).)