Mieliśmy projekt szkolny, każdy system informacyjny używający C. Aby zachować listę rekordów studentów o dynamicznym rozmiarze, wybrałem strukturę danych z listą linków. Dziś rano mój przyjaciel pozwolił mi zobaczyć jego system. Byłem zaskoczony jego listy rekordów:C globalna niezasilana tablica?
#include <stdio.h>
/* and the rest of the includes */
/* global unsized array */
int array[];
int main()
{
int n;
for (n=0; n < 5; n ++) {
array[n] = n;
}
for (n=0; n < 5; n ++) {
printf("array[%d] = %d\n", n, array[n]);
}
return 0;
}
Jak z kodem, oświadczył się niezagruntowanej tablicę, która jest globalnym (w segmencie BSS) do całego programu. Był w stanie dodawać nowych wpisów do tablicy przez nadpisanie kolejnych bloków pamięci o wartości innej niż zero, tak że może on przechodzić przez układ wygląda następująco:
for (n=0; array[n]; n++) {
/* do something */
}
Używał (ja również przetestowane go) Turbo C v1 . Próbowałem go w Linuksie i działa.
Ponieważ nigdy wcześniej nie spotkałem się z tą techniką, przypuszczam, że jest z nią jakiś problem. Więc, tak, chcę wiedzieć, dlaczego to zły pomysł i dlaczego wolisz to od połączonej listy.
Jest to to samo, co pisanie do dowolnej tablicy poza granicami - niezdefiniowane. – teppic
czy to ma być C99? –
1der Sprawdź aktualność aktualizacji teppic.i otwórz link do skryptu kodującego, możesz obserwować niezdefiniowane zachowanie C w kodzie. –