2011-11-09 12 views
8

Podczas czytania this question chciałem przetestować wejście w GCC, aby zobaczyć, jakie błędy będą wyprowadzane. Ku mojemu zaskoczeniu następujący wiersz:W C, czy inicjalizacja macierzy jest traktowana tylko z jednym elementem?

char array[] = {"s"}; 

kompiluje bez błędu lub ostrzeżenia, powodując szereg wielkości 2 zawierającego "s\0". Spodziewałbym się błędu kompilatora, ponieważ prawa strona wyrażenia jest typu char*[].

Czy inicjalizacja macierzy z jednym elementem nie jest w tym przypadku traktowana jako tablica i dlaczego?

Odpowiedz

6
char array[] = {"s"}; 

jest taki sam jak:

char array[] = "s"; 

Tutaj { } są opcjonalne w tym przypadku, ponieważ "s" jest ciąg dosłowne.

Albo

char array[] = {'s', '\0'}; 

W tym przypadku { } są konieczne, aby zainicjować tablicę.

+4

w szczególności w C można rzeczywiście zainicjować skalary za pomocą {} ... Zastanawiam się jednak, czy ma to jakikolwiek wpływ na wyrównanie. Nie .. nie ma wpływu na wyrównanie :) –

+0

OK. Więc muszę wziąć pod uwagę całe wyrażenie w tym przypadku, a nie tylko lewą stronę?'{" s "}' zdecydowanie nie jest tym samym, co '' s "', na przykład 'char array * [] = {" s "};' jest poprawne, ale 'char array * [] =" s ";' nie jest. – Antoine

+0

jak jest tablica char * [] = {"s"}; ważny? jest to błąd składniowy –

-10

prawidłowo zainicjowany łańcucha jest:

char array[] = "something"; 

jego tablicy 10 zwęglać.

ale jeśli piszesz:

`char* array = "something";` 

`to jest inny obiekt, nie będzie w stanie zmodyfikować zawartość tablicy.

oraz:

char* array[] 

nie jest ciągiem.

to tablica znaków char (char *). trzeba przydzielić pamięci dla każdego char *

exp:

char* array[3]; 
array[0] = malloc (10*sizeof(char)); 
strcpy(array[0] , "hello"); 

ale mieć tablicę char *, nie można zrobić bezpośrednio:

char* array[3]; 
array[0] = "hello"; 

ani:

char* array[] = {"first","second","other one","last"}; 

z tym init, ciągi nie mogą być modyfikowane.

dla osób mówiących, że to, co piszę, jest całkowicie błędne, czy wiesz, że znak * wymaga przydzielenia pamięci?

dlaczego więc -6 lub więcej?

Powiązane problemy