Przez przypadek stwierdziłem, że linia char s[] = {"Hello World"};
została poprawnie skompilowana i wygląda na to, że jest traktowana tak samo jak char s[] = "Hello World";
. Czy pierwsza ({"Hello World"}
) nie jest tablicą zawierającą jeden element, który jest tablicą znaków, więc deklaracja dla s powinna odczytać char *s[]
? W rzeczywistości, jeśli zmienię go na char *s[] = {"Hello World"};
, kompilator również zaakceptuje go, zgodnie z oczekiwaniami.Nawiasy wokół literału ciągu znaków w deklaracji tablicy znaków są poprawne? (np. char s [] = {"Hello World"})
Wyszukiwanie odpowiedzi, jedynym znalezionym miejscem, które o tym wspomniałem jest this one, ale nie ma cytowania normy.
Moje pytanie brzmi: dlaczego linia char s[] = {"Hello World"};
została skompilowana, mimo że lewa strona ma typ array of char
, a prawa strona to typ array of array of char
?
Po to program roboczy:
#include<stdio.h>
int main() {
char s[] = {"Hello World"};
printf("%s", s); // Same output if line above is char s[] = "Hello World";
return 0;
}
Dzięki za wszelkie wyjaśnienia.
P.S. Mój kompilator to gcc-4.3.4.
współpracuje z mingw32 – L7ColWinters
Zamieściłem podobne pytanie kilka miesięcy temu: http://stackoverflow.com/questions/8061346/in-c-is-array-initialization-with-only-one- traktowane jako element specjalnie – Antoine
wow .. 40upvotes .. – Jack