string jako tablica znaków - char * p

0

Witam,
moje pytanie jest związane z takim oto dziwnym programem (w zasadzie funkcją - nie pytajcie skąd się wzięła):

string kopiuj (string t) {
    char * p;
    for (int i = 0; i < t.length(); i++) {
        p[i] = t[i];
    }
    return p;
}

Program działa, ale zdaję sobie sprawę, że nie jest on poprawnie napisany - chodzi o to, że nie podaję długości tablicy znaków char * p, co wiąże się z tym, że nie wiadomo gdzie się ona kończy - teoretycznie może się ciągnąć w nieskończoność (poprawcie mnie jeśli nie mam racji). Podejrzewam również, że kompilator "domyśla się" na podstawie analizy pętli for, gdzie kończy się łańcuch p, po czym wstawia na jego końcu znak NULL.

Powiedzcie, czy waszym zdaniem jest to bezpieczne rozwiązanie, czy też może spowodować UB?
Jak można by inaczej kopiować nieznaną liczbę znaków z wejściowego stringa?

4

UB jak nic.
Poza tym kombinacje z d**y wzięte o ile te stringi to są std::string, bo tym można zrobić bez żadnych cudactw string1 = string2;

4

@luque212 ty sobie robisz jaja? :D Przecież nie zaalokowałeś tam żadnej pamięci tylko nadpisujesz pamięć na którą przypadkiem pokazuje ten twój wskaźnik. Jak wpiszesz więcej znaków to wywali się z segfaultem. Przy odrobinie wprawy można by ten program exploitować.

nieznaną liczbę znaków z wejściowego stringa?

Serio? Nieznaną? A length tego stringa to co ci zwraca? char * p = new char[t.length()+1]

0

Po co taka funkcja w ogóle skoro istnieje coś takiego jak string::c_str ?
Ktoś ładnie popłynął..

http://cpp.sh/5lq3d

3

To, że ta funkcja nie wykrzacza się od razu, to po prostu niefart. Wystarczy zmiana komputera/kompilatora, albo po prostu inna historia działania aplikacji, a będzie 100% SEGFAULT.
A nawet pomijając zawartość funkcji i jedynie biorąc pod uwagę argument i wartość zwracaną, to autor chyba był nieźle najarany, bo ta funkcja nie daje żadnej funkcjonalności (nawet po naprawieniu), której std::string nie ma.

0

std::string zawsze posiada znaną liczbę znaków. Masz na mysli "zmienna" liczbę znaków ?

Ta funkcja nie ma sensu, nie dodaje zadnej nowej funkcjonalnosci. Implementacja rowniez jest bledna i po prostu masz fart ze zadzialalo. Zmien kompilator albo opcje optymalizacji i jest duza szansa ze wywali Ci segmentation fault.

0

a wystarczyło napisać:

auto p = std::make_unique<char[]>(t.length()+1);

...
return p.get();

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