czas życia c-napisu

0

Witam
Po uruchomieniu poniższego programu w oknie konsoli wyświetla się napis "skonczyl sie wersal". I to mnie zastanawia bo c-napis "skonczy sie wersal" został utworzony w bloku funkcji func2 więc teoretycznie powinien zniknąć w chwili jej zakończenia(a zwracam tylko wskaźnik). I stąd pytanie: jaki jest czas życia tak utworzonego c-napisu?

#include <iostream>

const char* func2(void);

int main(void)
{
		std::cout << func2();
}

const char* func2(void)
{
	return "skonczyl sie wersal\n";
}

6

Przez cały czas wykonania programu (w końcu znajdują się w binarce).

1

został utworzony w bloku funkcji func2

Nie został utworzony w funkcji - bardziej został utworzony w momencie kompilacji (linkowania?) aplikacji i Twoja funkcja zwraca jedynie wskaźnik na napis już znajdujący się w pamięci.

Prosty eksperyment: wykonaj tę Twoją funkcję dwukrotnie i porównaj zwrócone wskaźniki (adresy) :-)

3

Ten kod jest dobry. UB byłoby gdyby funkcja wyglądała na przykład tak:

const char* func2(void)
{
    char text[256];
    sprintf(text, "skonczyl sie wersal\n");
    return text;
}
1

C nie ma specjalnie notacji "czasu życia" ale w Ruscie można to przedstawić:

fn func2() -> &'static str {
    "skonczyl sie wersal\n"
}

fn main() {
    println!("{}", func2());
}

To jest ok, bo jak sam widzisz czas życia jest ustalony na 'static, czyli nasz ciąg znaków żyje przez cały czas trwania programu.

Jednak jeśli skonstruujemy ciąg znaków dynamicznie:

fn func2() -> &'a str {
    let string = format!("skonczyl sie {}\n", "wersal");

    &*string
}

fn main() {
    println!("{}", func2());
}

Nie jesteśmy w stanie określić jak długi jest czas życia 'a przez co taki kod nie będzie działał.

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