Maximale Array Größe beim Avrgcc?

Persönliche Seite #1078364
Lesenswert?

Theoretische Antwort: Die Grösse eines Arrays dürfte in C eigentlich nur 
vom verfügbaren Speicher abhängen und schlimmstenfalls noch von den 
Adressierungsgepflogenheiten der Zielarchitektur.

Praxisbezogene Antwort: Keine Ahnung, ich war mit Arrays noch nie dort, 
wo die Grösse nicht mehr reichte. Probier's halt aus und schau, welches 
die begrenzenden Faktoren sind.

Schlaumeierische Antwort: Wenn die Datenmenge gross wird, kommt der 
Zeitpunkt, wo malloc nützlich wird. Memoryleaks, seid willkommen!
Gast #1078453
Lesenswert?

Der Compiler beschwert sich, das Array sei zu groß
1
bc.c: At top level:
2
bc.c:3683: error: size of array is too large

Das Array ist etwas über 32800 Byte groß. Wenn der Array Index signed 
int sein kann ist, wie A. K. gesagt hat, bei 32767 Byte schluss
#1078458
Lesenswert?

Wer den Grund dafür nachvollziehen will: Die Berechnung der Differenz 
zweier Adressen wie in:
  basetype_t *p, *q;
  ptrdiff_t delta = p - q;
darf man sich intern so vorstellen:
  ptrdiff_t delta = (char *)p - (char *)q;
  delta /= sizeof(basetype_t);
Und ptrdiff_t ist notwendigerweise vorzeichenbehaftet. Wenn das ein 
16bit int ist, landet man zwanglos bei einem Limit von 32767, auch dann 
wenn basetype_t kein char ist.

Und wer sich fragt, warum das Limit nicht 32768 ist: Bei einem array[N] 
existiert zwar keine Element array[N], aber für dessen Adresse muss
  &array[0..N-1] < &array[N]
gelten.
#1078465
Lesenswert?

Abhilfe, allgemeine Form: Statt
  basetype_t array[N];
mit N%K==0 verwendet man
  basetype_t array1[N/K], array2[N/K], ... arrayK[N/K];
  basetype_t array[K] = { array1, array2, ... arrayK };
und teilt den Index entsprechend auf:
  array[i/(N/K)][i%(N/K)]
was man in einem Makro verstecken kann.

In der Praxis sollte man statt mit einer teuren Division allerdings mit 
Subtraktion arbeiten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren