5 Stimmen

Wie speichert ein Array-Zeiger seine Größe?

#include "stdio.h"

#define COUNT(a) (sizeof(a) / sizeof(*(a)))

void test(int b[]) {
  printf("2, Anzahl:%d\n", COUNT(b));
}

int main(void) {
  int a[] = { 1,2,3 };

  printf("1, Anzahl:%d\n", COUNT(a));
  test(a);

  return 0;
}

Das Ergebnis ist offensichtlich:

1, Anzahl:3
2, Anzahl:1

Meine Fragen:

  1. Wo wird die Längeninformation (Anzahl/Größe) gespeichert, wenn "a" deklariert wird?
  2. Warum geht die Längeninformation (Anzahl/Größe) verloren, wenn "a" an die Funktion test() übergeben wird?

0voto

StasM Punkte 10085

Array-Pointer speichert die Größe nicht. Allerdings ist der []-Typ tatsächlich kein Zeiger. Es handelt sich um einen anderen Typ. Wenn Sie also int a[] = {1,2,3}; schreiben, definieren Sie ein Array mit 3 Elementen, und da es so definiert ist, gibt sizeof(a) Ihnen die Größe des gesamten Arrays.

Wenn Sie jedoch einen Parameter als int a[] deklarieren, ist es so gut wie dasselbe wie int *a und sizeof(a) wäre die Größe des Zeigers (was zufälligerweise die gleiche Größe wie int sein könnte, aber nicht immer).

In C gibt es keine Möglichkeit, die Größe im Zeigertyp zu speichern. Wenn Sie also die Größe benötigen, müssten Sie sie als zusätzliches Argument übergeben oder struct verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X