Aby zrozumieć ten błąd lub problem, powinieneś najpierw poznać różnicę między wskaźnikiem i tablicą, więc tutaj najpierw wyjaśnię ci różnice między nimi
tablica ciągów
char strarray[] = "hello";
W tablicy pamięci jest przechowywany w ciągłych komórkach pamięci, przechowywany tak samo jak [h][e][l][l][o][\0] =>[]
komórka pamięci o rozmiarze 1 bajta, a do tych ciągłych komórek pamięci można uzyskać dostęp pod nazwą o nazwie strarray tutaj. Więc tutaj strarray
sama tablica ciągów zawierająca wszystkie znaki łańcucha zainicjowane w tym. przypadku, "hello"
abyśmy mogli łatwo zmienić zawartość pamięci, uzyskując dostęp do każdego znaku według jego wartości indeksu
`strarray[0]='m'` it access character at index 0 which is 'h'in strarray
a jego wartość zmieniono na 'm'
tak zmienną wartość zmienną na "mello"
;
należy zwrócić uwagę na to, że możemy zmienić zawartość tablicy łańcuchów, zmieniając znak po znaku, ale nie możemy zainicjować innego łańcucha bezpośrednio na nim, ponieważ strarray="new string"
jest nieprawidłowy
Wskaźnik
Jak wszyscy wiemy wskaźnik wskazuje na lokalizację pamięci w pamięci, niezainicjowany wskaźnik wskazuje na losową lokalizację pamięci, a po inicjalizacji wskazuje na konkretną lokalizację pamięci
char *ptr = "hello";
tutaj wskaźnik ptr jest inicjowany na ciąg znaków, "hello"
który jest ciągiem stałym przechowywanym w pamięci tylko do odczytu (ROM), więc "hello"
nie można go zmienić, ponieważ jest przechowywany w pamięci ROM
a ptr jest przechowywany w sekcji stosu i wskazuje na stały ciąg "hello"
więc ptr [0] = 'm' jest nieprawidłowy, ponieważ nie można uzyskać dostępu do pamięci tylko do odczytu
Ale ptr można zainicjować bezpośrednio na inną wartość ciągu, ponieważ jest to tylko wskaźnik, więc może wskazywać dowolny adres pamięci zmiennej typu danych
ptr="new string"; is valid