übergeben - c zweidimensionales array




Was ist die maximale Größe eines Arrays in C? (5)

Die Größe des Zeigers begrenzt den Speicher, auf den Sie zugreifen können. Auch wenn die Hardware unbegrenzten Speicher bietet, ist der größte Datentyp, den Sie verwenden können, 64 Bit, und Sie können nur auf 2 ^ 64 Byte Speicher zugreifen.

Ich verstehe, dass Hardware die Menge an Speicher beschränkt, die während der Programmausführung zugewiesen wird. Meine Frage ist jedoch ohne Rücksicht auf Hardware. Unter der Annahme, dass die Speichermenge nicht begrenzt ist, gibt es keine Begrenzung für das Array?


Eine 64-Bit-Maschine könnte theoretisch maximal 2 ^ 64 Byte Speicher adressieren.


Ich denke, das größte theoretische Array wäre der Maximalwert von "unsigned long" (oder wie auch immer die größte ganze Zahl der neueste Standard ist / Ihr Compiler unterstützt)


Ich suchte nach einer Möglichkeit, die maximale Größe für ein Array zu bestimmen. Diese Frage scheint dasselbe zu sein, deshalb möchte ich meine Ergebnisse teilen.

Anfangs stellt C keine Funktion zur Verfügung, um die maximale Anzahl von Elementen zu bestimmen, die während der Kompilierungszeit in einem Array zuweisbar sind. Dies liegt daran, dass es vom verfügbaren Arbeitsspeicher in der Maschine abhängt, auf der es ausgeführt wird.

Auf der anderen Seite habe ich herausgefunden, dass Speicherzuordnungsfunktionen ( calloc() und malloc() ) ermöglichen, größere Arrays zuzuweisen. Darüber hinaus können Sie mit diesen Funktionen Laufzeitspeicherzuordnungsfehler behandeln.

Ich hoffe, das hilft.


C99 5.2.4.1 Minimale Größe der Übersetzungsgrenzen

Die Implementierung muss in der Lage sein, mindestens ein Programm zu übersetzen und auszuführen, das mindestens eine Instanz jeder der folgenden Grenzen enthält: 13)

  • 65535 Byte in einem Objekt (nur in einer gehosteten Umgebung)

13) Implementierungen sollten möglichst keine festen Übersetzungsgrenzen auferlegen.

Dies legt nahe, dass eine konforme Implementierung das Kompilieren eines Objekts (das Arrays enthält) mit mehr als short Bytes verweigern kann.

PTRDIFF_MAX scheint ein praktisches Limit für statische Array-Objekte zu sein

Der C99-Standard 6.5.6 Additive Operatoren sagt:

9 Wenn zwei Zeiger subtrahiert werden, müssen beide auf Elemente desselben Array-Objekts oder eines nach dem letzten Element des Array-Objekts zeigen; Das Ergebnis ist die Differenz der Indizes der beiden Array-Elemente. Die Größe des Ergebnisses ist implementationsdefiniert, und sein Typ (ein Typ mit ptrdiff_t mit Vorzeichen) ist ptrdiff_t , der im Header <stddef.h> definiert ist. Wenn das Ergebnis in einem Objekt dieses Typs nicht darstellbar ist, ist das Verhalten nicht definiert.

Das bedeutet für mich, dass Arrays, die größer als ptrdiff_t sind, in der Theorie erlaubt sind, aber dann können Sie die Differenz ihrer Adressen nicht portabel nehmen.

Aus diesem Grund scheint GCC Sie nur auf ptrdiff_t zu ptrdiff_t . Dies wird auch erwähnt unter: Warum ist die maximale Größe eines Arrays "zu groß"?

Ich habe das empirisch mit main.c verifiziert:

#include <stdint.h>

uint8_t a[(X)];

int main(void) {
    return 0;
}

und dann in Ubunbu 17.10:

$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ printf '
> #include <stdint.h>
> PTRDIFF_MAX
> SIZE_MAX
> ' | arm-linux-gnueabi-cpp | tail -n2
(2147483647)
(4294967295U)
$ PTRDIFF_MAX == 2147483647 == 2^31 - 1
$
$ # 2lu << 30 == 2^31 == PTRDIFF_MAX + 1
$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30)' main.c
a.c:5:9: error: size of array ‘a’ is too large
 uint8_t a[(X)];
         ^
$
$ # PTRDIFF_MAX
$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30) - 1lu' main.c
$

Siehe auch





arrays