Maximale Array Größe beim Avrgcc?

Persönliche Seite
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
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
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.
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.