Чтобы понять эту ошибку или проблему, вы должны сначала знать разницу между ч / б указателем и массивом, поэтому сначала я объясню вам различия ч / б
массив строк
char strarray[] = "hello";
В памяти массив хранится в непрерывных ячейках памяти, хранится как [h][e][l][l][o][\0] =>[]
ячейка памяти размером 1 символ, и к этим ячейкам непрерывной памяти можно обращаться по имени с именем strarray здесь. Так что здесь сам строковый массив strarray
содержит все символы строки, инициализированные в нем. случай здесь, "hello"
так что мы можем легко изменить его содержимое памяти, обращаясь к каждому символу по его значению индекса
`strarray[0]='m'` it access character at index 0 which is 'h'in strarray
и его значение изменилось 'm'
так, что значение изменилось на"mello"
;
Здесь следует отметить, что мы можем изменить содержимое массива строк, изменив символ за символом, но не можем инициализировать другую строку непосредственно к ней, например strarray="new string"
это неверно
Указатель
Как мы все знаем, указатель указывает на ячейку памяти в памяти, неинициализированный указатель указывает на произвольную ячейку памяти, а после инициализации указывает на определенную ячейку памяти.
char *ptr = "hello";
здесь указатель ptr инициализируется строкой, "hello"
которая является константной строкой, хранящейся в постоянном запоминающем устройстве (ПЗУ), поэтому "hello"
ее нельзя изменить, поскольку она хранится в ПЗУ
и ptr хранится в секции стека и указывает на постоянную строку "hello"
поэтому ptr [0] = 'm' недопустимо, так как вы не можете получить доступ только для чтения памяти
Но ptr может быть инициализирован непосредственно к другому строковому значению, так как это просто указатель, поэтому он может указывать на любой адрес памяти переменной своего типа данных
ptr="new string"; is valid