Щоб зрозуміти цю помилку або проблему, слід спершу знати різницю b / w вказівник і масив, тому тут по-перше, я поясню вам відмінності, б / в їх
рядковий масив
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'
таке значення strarray, яке змінилося на "mello"
;
тут слід зазначити, що ми можемо змінити вміст масиву рядків, змінивши символ на символ, але не можемо ініціалізувати інший рядок безпосередньо до нього, як strarray="new string"
недійсний
Покажчик
Як ми всі знаємо, покажчик вказує на місце пам'яті в пам'яті, неініціалізований покажчик вказує на місце випадкової пам'яті, а після ініціалізації вказує на певне місце пам'яті
char *ptr = "hello";
тут вказівник ptr ініціалізується до рядка, "hello"
який є постійною рядком, що зберігається в пам'яті лише для читання (ROM), тому "hello"
не може бути змінений, оскільки він зберігається в ПЗУ
і ptr зберігається в розділі стека і вказує на постійний рядок "hello"
тому ptr [0] = 'm' недійсний, оскільки ви не можете отримати доступ лише до пам'яті для читання
Але ptr можна ініціалізувати безпосередньо на іншому рядковому значенні, оскільки це просто вказівник, тому він може вказувати на будь-яку адресу пам'яті змінної свого типу даних
ptr="new string"; is valid