Pytanie odnośnie uzycia wskaźników

0
#include <stdio.h>

void strcat(char *s, char *b);

int main()
{
    char a[]="Abra ";
    char b[]="Kadabra";
    //char *a="Abra ";
    //char *b="Kadabra";

    strcat(a,b);
    printf("%s\n",a);

    return 0;
}

// strcat: dołącza ciąg t na końcu ciągu s
void strcat (char *s, char *t)
{
    while (*s) s++;
    while (*s++ = *t++);
}

Mam pytanie, dlaczego jeżeli zdefiniuję zmienne jako wskaźniki do tekstu program nie działa, natomiast nie ma problemu jeśli te zmienne będą tablicami? Dziwi mnie to, ponieważ doczytałem, że zmienna tablicowa ma określoną przy definicji długość w przeciwieństwie do zmiennych wskaźnikowych. Proszę o wytłumaczenie.

0

Bo najpierw trzeba zadeklarować pamięć na ten twój napisek:

char* a = new char[50];
a = "ala ma kota a kot ma w ryja";
0

Więc jeśli zrobię tak:

char *s="Hermenegilda";

Kompilator nie protestuje, więc napis też musi gdzieś w tej pamięci znaleźć.

1

Tak znajduje się, ale nadpisywanie w nie swojej pamięci etc. nie jest fajnie, na pewno nie skutki tego.

1

Taki napis jest napisałem STAŁYM i leży w segmencie pamieci którego NIE WOLNO ZMIENIAĆ. Tablica jest na stosie/stercie i można ją zmieniać.

0

Aaaaaaaaa, to takie buty, dzięki.

1

Kompilator nie protestuje, ale sama aplikacja po uruchomieniu może się malowniczo wyłożyć. Wszystkie literały jakie zawierasz w kodzie są przechowywane w specjalnym miejscu. Robi się to dlatego, żeby między innymi zaoszczędzić pamięć, gdy kilka razy w kodzie używasz tych samych literałów. Ta pamięć może być np. specjalnie chroniona (zablokowana przed zapisem).
Kiedy po lewej stronie przypisania literału będzie deklaracja tablicy, literał ten zostanie przekopiowany do pamięci, którą właśnie deklarujesz - tablicę na stosie.

Pamiętaj oczywiście o tym, że tablica tworzona w ten sposób też ma określoną wielkość (ilość znaków + 1) i próba wpisania coś za nią może być katastrofalna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1