Literały ciągów: wskaźnik vs tablica znaków

W tym stwierdzeniu:

char *a = "string1"

Czym dokładnie jest literalny ciąg znaków? Czy to string1? Ponieważ ten wątek jaki jest typ liter ciągów w C i C++? mówi coś innego.

Według mojej wiedzy

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;
} 

Proszę dodać kilka szczegółów innych niż wyżej wymienione punkty. Dzięki.

Wyjście debugowania pokazujące błąd w 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
Author: Community, 2012-10-09

1 answers

Można spojrzeć na ciąg znaków jako "ciąg znaków otoczony podwójnymi cudzysłowami" . Ten łańcuch jest przechowywany w pamięci tylko do odczytu i próba modyfikacji tej pamięci prowadzi do niezdefiniowanego zachowania .

więc jak to się stało, że masz błąd segmentacji?
- Głównym punktem jest to, że char *ptr = "string literal" sprawia, że ptr wskazuje na pamięć tylko do odczytu, w której przechowywany jest literał ciągu. Więc kiedy próbujesz uzyskać dostęp do tej pamięci: ptr[0] = 'X' (która jest przez sposób równoważny *(ptr + 0) = 'X'), jest to naruszenie dostępu do pamięci.

Z drugiej strony: char b[] = "string2"; przydziela pamięć i kopiuje do niej łańcuch "string2", modyfikując go w ten sposób. Pamięć ta jest uwalniana, gdy b wychodzi poza zasięg.

Spójrz na literalny inicjalizator ciągu znaków dla tablicy znaków

 14
Author: LihO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:16