Arraygröße bestimmen
-
miller_m schrieb:
int nAnzahlderElemente = sizeof(bFC) / sizeof(bFC)[0];[edit]
tags@miller_m::Thx das geht.
sizeof(bFC) -> gibt die anzahl elemente an
sizeof(bFC)[0] -> anzahl elemente in Array Position 0dann könnte ich also zb in einem mehrdimensonalen array (zb bFCM[10][10]) mit hilfe von sizeof(bFC)[0] die grösse der 2. dimenson herausfinden oder?
-
-
habs jetzt begriffen.
gibt die anzahl bytes des Datentypes zurück
-
miller_m schrieb:
int nAnzahlderElemente = sizeof(bFC) / sizeof(bFC)[0];Sollte eher so aussehen
size_t nAnzahlderElemente = sizeof(bFC) / sizeof(bFC[0]);
-
Ich bin gerade drüber für meine Semesterprüfung in Info alte Prüfungen zu machen, und bin auch über ein Problem mit Arraygrößen gestolpert, deswegen schreib ichs hier einfach mal mit rein.
Was gibt das folgende Programm aus, wenn für Zeiger vier Bytes verwendet werden?
#include <stdio.h>
void fkt1(int *zgr) {printf("%d\n", sizeof(zgr));}
void fkt2(int arr[]) {printf("%d\n", sizeof(arr));}
void fkt3(int arr[100]) {printf("%d\n", sizeof(arr));}
void fkt4(int mat[100][200]) {printf("%d\n", sizeof(mat));}
void fkt5(int (*mat)[200]) {printf("%d\n", sizeof(*mat));}int main(void)
{
int *ptr,
a[100],
z[100][200];
fkt1(ptr);
fkt2(a);
fkt3(a);
fkt4(z);
fkt5(z);
printf("%d\n", sizeof(z));
return 0;}
Das ist die Aufgabenstellung, schaut auch nicht besonders schwer aus, aber wenn ichs bei mir durch den Compiler laufen lass komm ich auf ein komisches Ergebniss:
4 (ist logisch da ein Zeiger 4 Byte groß ist)
4 (auch ein Zeiger)
4 (versteh ich überhaupt nicht, sollte hier nicht 400 stehen?)
4 (müssten das nicht 80000 sein?)
800 (kann mir unter (int (*mat)[200]) nicht wirklich was vorstellen
)Vielleicht könnt ihr mir ja weiterhelfen und erklären warum der Compiler so komische Ergebnisse auspuckt.
Schonmal vielen Dank für eure Mühen.
-
void fkt3(int arr[100]) {printf("%d\n", sizeof(arr));}
void fkt4(int mat[100][200]) {printf("%d\n", sizeof(mat));}auch wenn es hier so aussieht, als wenn Felder übergeben werden, werden trotzdem nur Zeiger auf die ersten Elemente übertragen, und Zeiger wie du schon selber geschrieben hast ist 4 Byte groß
int (*mat)[200]
das hier ist ein Feld von 200 Zeigern, die auf ein int Zeigen.
Das Feld widerrum wird voll übergeben(warum weis ich nicht) so kommst du aber auf die 800 (4 Byte * 200)
-
Pellaeon schrieb:
int (*mat)[200]
das hier ist ein Feld von 200 Zeigern, die auf ein int Zeigen.
Das Feld widerrum wird voll übergeben(warum weis ich nicht) so kommst du aber auf die 800 (4 Byte * 200)
Das ist ein Zeiger auf ein Feld von ints.
-
sicher? ich würd meinen
"int* mat[200]"
Feld von der Größe 200 vom Typ int* würde ich sagen, also ein Feld von 200 Zeigern!!!
-
Wenn ich das richtig verstanden habe mit fkt4(z) (int z[100][200]) ein zweidimensionales feld von int-werten übergeben. -> also interpretiert die funktion fkt4(int (*mat)[200]) dies auch so.
-
Hallo,
Pellaeon schrieb:
sicher? ich würd meinen
"int* mat[200]"
Feld von der Größe 200 vom Typ int* würde ich sagen, also ein Feld von 200 Zeigern!!!Ganz sicher, warum meinst du sollten die Klammern hier
int (*mat)[200];die du so einfach weggelassen hast, keine Bedeutung haben (ohne Klammern stimmt deine Aussage, aber ich glaube, du hast sie einfach vernachlässigt)? Die Klammern sorgen dafür, daß YASC völlig recht hat:
Man liest:
mat ist ein Zeiger:
...(*mat)...
auf ein Array
...[...]...
mit 200
int ...
Elementen.
Auch für eine solche Definiton kann man hier den Operatorenvorrang anwenden:
Da der []-Operator höheren Vorrang als der *-Operator hat, wird hier
int *mat[200];zuerst gelesen:
mat ist ein Array...usw...
Durch die Klammerung oben wird, wie üblich, eine andere "Auswertung" der Definition erzwungen, und deswegen wird es, wie oben beschrieben, anders gelesen. Die Folge ist: mat ist ein völlig anderer Variablentyp als der, den du erwartet hast.
MfG