2011-10-20 17 views
10

To jest kontynuacja kolejnego question Mam.Inicjalizacja tablic ciągów

Rozważmy następujący kod:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

To nie kompiluje ku mojemu zdziwieniu (widocznie nie znam składni C jak myślałem) i generuje następujący błąd:

error: initializer element is not constant 

Jeśli zmienię char * do char [] kompiluje grzywny:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

Czy ktoś mógłby wyjaśnić mi, dlaczego?

Odpowiedz

6

W pierwszym przykładzie (char *hi = "hello";) tworzony jest wskaźnik niestały, który jest inicjowany, aby wskazywał na ciąg statyczny "hello". Ten wskaźnik może teoretycznie wskazywać na wszystko, co lubisz.

W drugim przykładzie (char hi[] = "hello";) definiuje się konkretnie tablicę, a nie wskaźnik, więc adres, do którego się odwołuje, jest niemodyfikowalny. Zauważ, że tablica może być uważana za niemodulowalny wskaźnik do określonego bloku pamięci.

Twój pierwszy przykład faktycznie kompiluje się bez problemu w C++ (przynajmniej mój kompilator).

+1

dzięki. czy istnieje sposób użycia słowa kluczowego const, aby pierwszy kod działał? – lang2

+1

@ lang2 Nie w tym zakresie. Zobacz ten [C FAQ] (http://c-faq.com/ansi/constasconst.html). Nawet z 'char * const hi' (stały wskaźnik do char). – cnicutar

+0

Po prostu coś dodałem, ale nie jestem pewien, czy to zadziała ... twoja pierwsza wersja kompiluje OK w C++ - Spróbuję z kompilatorem C kiedy dostanę chwilę :) – icabod