Строковые литералы: указатель на массив символов
В этом заявлении:
char *a = "string1"
Что именно является строковым литералом? Это string1
? Потому что этот поток Какой тип строковых литералов в C и C++? говорит что-то другое.
Насколько мне известно
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Пожалуйста, добавьте некоторые детали, кроме вышеупомянутых пунктов. Благодарю.
Отладочный вывод, показывающий ошибку в a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: file ddd.c, line 4.
(gdb) r
Starting program: /home/jay/Desktop/MI/chararr/a.out
Breakpoint 1, main () at ddd.c:4
4 {
(gdb) n
6 char *a = "string1";
(gdb) n
7 char b[] = "string2";
(gdb)
9 a[0] = 'Y';
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400595 in main () at ddd.c:9
1 ответ
Вы можете рассматривать строковый литерал как "последовательность символов, заключенную в двойные кавычки". Эта строка хранится в постоянной памяти, и попытка изменить эту память приводит к неопределенному поведению.
Так почему же вы получили ошибку сегментации?
- Главное, что char *ptr = "string literal"
марки ptr
указать на постоянную память, где хранится ваш строковый литерал. Итак, когда вы пытаетесь получить доступ к этой памяти: ptr[0] = 'X'
(что, кстати, эквивалентно *(ptr + 0) = 'X'
), это нарушение доступа к памяти.
С другой стороны: char b[] = "string2";
выделяет память и копирует строку "string2"
в него, таким образом, его изменение действительно. Эта память освобождается, когда b
выходит за рамки.
Посмотрите на инициализатор литеральной строки для массива символов