Nie jestem pewien, co będzie w tablicy char po inicjalizacji w następujący sposób.
1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
W przypadku 2 myślę, że buf[0]
powinno być ' '
, buf[1]
powinno być '\0'
i od buf[2]
do buf[9]
będzie losową zawartością. W przypadku 3 myślę, że buf[0]
powinno być 'a'
, buf[1]
powinno być „\ 0”, a od buf[2]
do buf[9]
będzie losową zawartością.
Czy to jest poprawne?
A w przypadku 1, co będzie w buf
? buf[0] == '\0'
a od buf[1]
do buf[9]
będzie losową zawartością?
char buf[10]; buf = "a";
czy nie skompilować. - Proszę spróbować najpierw, a następnie skopiuj / wklej rzeczywisty kod w pytaniu. To oszczędza dużo pracy Tobie i wszystkim czytelnikom twojego pytania.Odpowiedzi:
Nie jest to sposób inicjalizacji tablicy, ale dla:
Pierwsza deklaracja:
jest równa
Druga deklaracja:
jest równa
Trzecia deklaracja:
jest równa
Jak widać, nie ma przypadkowej zawartości: jeśli jest mniej inicjatorów, pozostała część tablicy jest inicjalizowana za pomocą
0
. Dzieje się tak nawet wtedy, gdy tablica jest zadeklarowana wewnątrz funkcji.źródło
char
.0
i'\0
mają tę samą wartość.char buff[3] = "abcdefghijkl";
jest nieprawidłowy.char p3[5] = "String";
jest również nieprawidłowy.char p[6] = "String";
jest ważny i jest taki sam jakchar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Edycja: OP (lub redaktor) po cichu zmienił niektóre pojedyncze cudzysłowy w oryginalnym pytaniu na podwójne cudzysłowy w pewnym momencie po udzieleniu tej odpowiedzi.
Twój kod spowoduje błędy kompilatora. Twój pierwszy fragment kodu:
jest podwójnie nielegalne. Po pierwsze, w C nie ma czegoś takiego jak pusty
char
. Możesz użyć podwójnych cudzysłowów, aby oznaczyć pusty ciąg, tak jak w przypadku:To da ci wskaźnik do
NUL
łańcucha, tj. Jednoznakowego łańcucha zawierającego tylkoNUL
znak. Ale nie możesz używać pojedynczych cudzysłowów, które nie zawierają niczego - to jest nieokreślone. Jeśli chcesz wyznaczyćNUL
postać, musisz to określić:Ukośnik odwrotny jest niezbędny do ujednoznacznienia znaku
'0'
.prowadzi do tego samego, ale myślę, że to pierwsze jest nieco mniej dwuznaczne.
Po drugie, nie można zainicjować tablic po ich zdefiniowaniu.
deklaruje i definiuje tablicę. Identyfikator tablicy
buf
jest teraz adresem w pamięci i nie można zmienić miejscabuf
wskazującego poprzez przypisanie. Więcjest nielegalne. Z tego powodu Twoje drugie i trzecie fragmenty kodu są nielegalne.
Aby zainicjować tablicę, musisz to zrobić w momencie definiowania:
poda 10-znakową tablicę, gdzie pierwszy znak to spacja,
'\040'
a reszta toNUL
np'\0'
. Gdy tablica jest zadeklarowana i zdefiniowana za pomocą inicjatora, elementy tablicy (jeśli istnieją) poza tymi z określonymi wartościami początkowymi są automatycznie uzupełniane0
. Nie będzie żadnej „przypadkowej zawartości”.Jeśli zadeklarujesz i zdefiniujesz tablicę, ale jej nie zainicjujesz, jak w poniższym przykładzie:
będziesz mieć losową zawartość wszystkich elementów.
źródło
Te są równoważne
Te są równoważne
Te są równoważne
źródło
Odpowiednia część projektu standardu C11 n1570 6.7.9 inicjalizacji mówi:
i
W ten sposób, jeśli jest wystarczająca ilość miejsca , dopisywany jest znak „\ 0” , a pozostałe znaki są inicjowane wartością,
static char c;
która zostanie zainicjowana w funkcji.Wreszcie,
Tak więc,
char
będąc typem arytmetycznym, reszta tablicy jest również zainicjowana zerami.źródło
Co ciekawe, tablice można inicjalizować w dowolny sposób w dowolnym momencie w programie, pod warunkiem, że są członkami a
struct
lubunion
.Przykładowy program:
źródło
Nie jestem pewien, ale zwykle inicjalizuję tablicę jako "" w takim przypadku nie muszę martwić się o zerowy koniec łańcucha.
źródło
main()
(i powinieneś również użyćvoid
, npint main(void) { ... }
. C99 pozbył się tej reguły, więc ten kod nie będzie się kompilował dla C99 i późniejszych. Inną rzeczą wartą uwagi jest to, że zaczynając od C99, jeśli pominieszreturn
w main, istnieje automatycznereturn 0;
umieszczenie / domniemanie przed}
końcem main. Używasz niejawnej reguły int, która działa tylko przed C99, ale używasz niejawnej,return
która działa tylko z C99 i później ; te dwie są oczywiście sprzeczne .