Warum stimmt die Größe eines als Parameter gesendeten Arrays nicht mit der von main überein?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
sizeof
Operator gibt ein Objekt vom Typsize_t
, so dass Sie es mit gedruckt werden soll%zu
(C99) oder werfen es ,int
wenn Sie verwenden%d
oben in Ihrem wieprintf
Anrufe.void PrintSize(int (*p_someArray)[10])
. Innerhalb der Funktion können Sie mit dem Dereferenzierungsoperator auf das Array zugreifen*
:sizeof(*p_someArray)
. Dies hat den gleichen Effekt wie die Verwendung von Referenzen in C ++.Es ist ein Zeiger, deshalb ist es eine übliche Implementierung, die Größe des Arrays als zweiten Parameter an die Funktion zu übergeben
quelle
Wie andere angegeben haben, zerfallen Arrays in Zeiger auf ihr erstes Element, wenn sie als Funktionsparameter verwendet werden. Es ist auch erwähnenswert, dass sizeof den Ausdruck nicht auswertet und keine Klammern erfordert, wenn er mit einem Ausdruck verwendet wird. Daher wird Ihr Parameter überhaupt nicht verwendet. Sie können also auch die Größe von mit dem Typ und nicht mit dem Wert schreiben.
quelle
Sie müssen also die Länge des Arrays als zweiten Parameter übergeben. Wenn Sie Code schreiben, in dem Sie beide ein Array mit konstanter Größe deklarieren und dieses Array später an eine Funktion übergeben, ist es schwierig, wenn die Array-Längenkonstante an mehreren Stellen in Ihrem Code angezeigt wird ...
K & R zur Rettung:
So, jetzt können Sie zB:
quelle
Weil Arrays in Zeiger zerfallen, wenn sie als Parameter übergeben werden. So funktioniert C, obwohl Sie "Arrays" in C ++ als Referenz übergeben und dieses Problem beheben können. Beachten Sie, dass Sie Arrays unterschiedlicher Größe an diese Funktion übergeben können:
quelle
Das Verhalten, das Sie gefunden haben, ist tatsächlich eine große Warze in der C-Sprache. Immer wenn Sie eine Funktion deklarieren, die einen Array-Parameter akzeptiert, ignoriert der Compiler Sie und ändert den Parameter in einen Zeiger. Diese Erklärungen verhalten sich also alle wie die erste:
a ist in allen vier Fällen ein Zeiger auf int. Wenn Sie ein Array an func übergeben, zerfällt es sofort in einen Zeiger auf sein erstes Element. (Auf einem 64-Bit-System ist ein 64-Bit-Zeiger doppelt so groß wie ein 32-Bit-Int, sodass Ihre Größe des Verhältnisses 2 zurückgibt.)
Der einzige Zweck dieser Regel besteht darin, die Abwärtskompatibilität mit historischen Compilern aufrechtzuerhalten, die die Übergabe von Aggregatwerten als Funktionsargumente nicht unterstützt haben.
Dies bedeutet nicht, dass es unmöglich ist, ein Array an eine Funktion zu übergeben. Sie können diese Warze umgehen, indem Sie das Array in eine Struktur einbetten (dies ist im Grunde der Zweck des std :: -Arrays von C ++ 11):
oder indem Sie einen Zeiger auf das Array übergeben:
Falls die Arraygröße keine Konstante zur Kompilierungszeit ist, können Sie die Zeiger-zu-Array-Technik mit C99-Arrays variabler Länge verwenden:
quelle
In c ++ können Sie zu diesem Zweck ein Array als Referenz übergeben:
quelle
In der Sprache C gibt es keine Methode zum Bestimmen der Größe eines unbekannten Arrays, daher muss die Menge sowie ein Zeiger auf das erste Element übergeben werden.
quelle
char[]
String-Arrays).Sie können keine Arrays an Funktionen übergeben.
Wenn Sie die Größe wirklich drucken möchten, können Sie einen Zeiger auf ein Array übergeben, der jedoch überhaupt nicht generisch ist, da Sie auch die Arraygröße für die Funktion definieren müssen.
quelle
Das Verhalten ist beabsichtigt.
Dieselbe Syntax in der Deklaration von Funktionsparametern bedeutet etwas völlig anderes als in der Definition lokaler Variablen.
Der Grund ist in anderen Antworten beschrieben.
quelle
Wenn Sie in der Sprache C das Array als Argument an die Funktion übergeben, wird es automatisch in einen Zeiger konvertiert. Das Array, das von einer Funktion übergeben wird, wird als Referenzaufruf bezeichnet. Aus diesem Grund empfängt die aufgerufene Funktion nur den Zeiger, der auf das erste Funktionselement zeigt. Dies ist der Grund
fun (int a []) ähnelt fun (int * a);
Wenn Sie also die Größe des Arrays drucken, wird die Größe des ersten Elements gedruckt.
quelle
In der Programmiersprache 'C' ist 'sizeof ()' der Operator und er gibt die Größe des Objekts in Bytes zurück. Das Argument des Operators 'sizeof ()' muss ein Typ mit linkem Wert sein (Ganzzahl, Gleitkommazahl, Struktur, Array) ). Wenn Sie also die Größe eines Arrays in Bytes wissen möchten, können Sie dies ganz einfach tun. Verwenden Sie einfach den Operator 'sizeof ()' und für sein Argument den Namen des Arrays. Beispiel:
Die Ausgabe auf dem 32-Bit-System ist: Größe von n ist: 40. Weil die Ganzzahl auf dem 32-System 4 Bytes beträgt. Auf 64x sind es 8 Bytes. In diesem Fall haben wir 10 Ganzzahlen in einem Array deklariert. Das Ergebnis ist also '10 * sizeof ( int) '.
Einige Hinweise:
Wenn wir ein Array wie dieses deklariert haben, ist 'int n [] = {1, 2, 3, ... 155 ..};'. Wir möchten also wissen, wie viele Elemente in diesem Array gespeichert sind. Verwenden Sie diesen Algorithmus:
sizeof (name_of_the_array) / sizeof (array_type)
Code: #include
Main(){
}}
quelle
sizeof(n)
einer lokalen Variablen undsizeof(arg)
einem Argument für eine Funktion geht, obwohl beide scheinbar vom Typ sindint[10]
.Arrays sind nur lose dimensioniert. Ein Array ist größtenteils ein Zeiger auf den Speicher. Die Größe in Ihrer Deklaration gibt dem Compiler nur an, wie viel Speicher für das Array reserviert werden soll. Sie ist nicht mit dem Typ verknüpft, sodass sizeof () nichts weiter zu tun hat.
quelle