- Wo wird die Längen(informations-)angabe gespeichert, wenn "a" deklariert wird?
Es wird nirgendwo gespeichert. Der sizeof
-Operator (der in der COUNT()
-Makro verwendet wird) gibt die Größe des gesamten Arrays zurück, wenn er als Operand ein echtes Array erhält (wie beim ersten printf()
).
- Warum geht die Längen(informations-)angabe verloren, wenn "a" an die test()-Funktion übergeben wird?
Leider sind in C Arrays, die als Parameter an Funktionen übergeben werden, eine Fiktion. Arrays werden nicht an Funktionen übergeben; der Parameter wird als Zeiger behandelt, und das Array-Argument, das im Funktionsaufruf übergeben wird, wird zu einem einfachen Zeiger 'zerfallen'. Der sizeof
-Operator gibt die Größe des Zeigers zurück, die keine Korrelation zur Größe des Arrays hat, das als Argument verwendet wurde.
Als Randnotiz, in C++ können Sie einen Funktionsparameter als Referenz zu einem Array haben, und in diesem Fall wird der vollständige Array-Typ der Funktion zur Verfügung gestellt (d. h. das Argument zerfällt nicht in einen Zeiger und sizeof
gibt die Größe des gesamten Arrays zurück). Allerdings muss das Argument in diesem Fall genau dem Arraytyp entsprechen (einschließlich der Anzahl von Elementen), was die Technik größtenteils nur mit Vorlagen nützlich macht.
Zum Beispiel wird das folgende C++-Programm das Erwartete tun:
#include "stdio.h"
#define COUNT(a) (sizeof(a) / sizeof(*(a)))
template
void test(int (&b)[T]) {
printf("2, count:%d\n", COUNT(b));
}
int main(int argc, char *argv[]) {
int a[] = { 1,2,3 };
printf("1, count:%d\n", COUNT(a));
test(a);
return 0;
}