2013-02-15 15 views
5

Dlaczego to nie działa? Czy możliwe jest wykonanie kreatywnego castingu, aby to zadziałało?Inicjowanie rzutowania aż do wskaźnika

1: const char* yo1 = "abc"; 
2: const char* yo2 = { 'a', 'b', 'c', '\0' }; // <-- why can't i do this? 
3: printf("%s %s\n", yo1, yo2); 

Wynik: Segmentacja Fault

Linia 2 nie robi, czego od niego oczekujesz.

Odpowiedz

5

można zrobić:

const char* yo2 = (char [4]) { 'a', 'b', 'c', '\0' }; 

co jest ważne i co chcesz osiągnąć. Zauważ, że nie jest równoznaczne z:

const char* yo2 = "abc": 

W pierwszym przypadku, gdy yo2 została zadeklarowana w pliku-Scope: związek dosłowne tablica ma statyczny czas przechowywania ale kiedy yo2 została zadeklarowana w bloku-Scope dosłowne związek ma automatyczny czas przechowywania.

W tym ostatnim przypadku, "abc" jest literałem ciąg i ma czas przechowywania statycznego (zakres pliku lub zakres bloku).

Można również użyć tablicę zamiast wskaźnika:

const char yo2[] = { 'a', 'b', 'c', '\0' }; 

dotycząceTwojego przykład. C:

const char* yo2 = { 'a', 'b', 'c', '\0' }; 

nie jest ważna i kompilator interpretuje ją jako:

const char* yo2 = (char *) 'a'; 

Wartość 'a' nie jest wartością wskaźnik (adres) tak dereferencing yo2 wywołuje niezdefiniowanej zachowanie.

+0

Nie! RHS jest tymczasowy; nie ma gwarancji, że się utrzyma. – nneonneo

+0

@nneonneo to dosłownie złożony. Ma automatyczny czas przechowywania, jeśli został zadeklarowany w zakresie bloku. Dlaczego teraz spadamy? – ouah

+0

W C, tak. Ale staje się to niebezpieczne, gdy tylko użyjesz go w C++ lub skompilujesz go w trybie C++. Dlatego nie jest to bezpieczna praktyka w moich książkach. – nneonneo

Powiązane problemy