2013-03-19 14 views

Odpowiedz

14

typ łańcucha dosłownym "Hello" jest "tablica 6 constchar".

Zwykłe literały ciągów i literały ciągów UTF-8 są również nazywane wąskimi literałami ciągów. Wąski Łańcuch znaków ma typ „tablica nconst char”, w którym njest rozmiar łańcucha [...]

Jednakże może być przekształcony w const char* przez macierz do Konwersja pointeru. Konwersja tablicy do wskaźnika powoduje wyświetlenie wskaźnika do pierwszego elementu tablicy.

+0

To prawdopodobnie tłumaczy, dlaczego ten kod pokazuje ostrzeżenie 'C4172 zwracający adres zmiennej lokalnej lub tymczasowej' dla tej funkcji 'const char * const & f() {return "witaj"; } 'w VS2010. Czy zgadzasz się z tym ? – Belloc

+1

@ user1042389 Wskaźnik będący wynikiem konwersji tablica-do-wskaźnika jest obiektem tymczasowym. Zwracasz referencję do tego obiektu, więc referencja pozostaje zwisająca. –

+0

Gdzie jest tymczasowy? "hello" istnieje w pamięci statycznej! – Belloc

4

Standard definiuje go jako "tablicę z n const char", więc jest to const char[n] (n jest rozmiarem ciągu, łącznie z kończącym bajtem NUL).

sekcja 7 § 2.14.15:

Wąski Łańcuch znaków ma typ „układ n const karbonizatu”, w którym n oznacza wielkość łańcuchu, jak zdefiniowano poniżej i posiada statyczną czas przechowywania.

Powiązane problemy