Warum ist die Größe eines Array-Parameters nicht die gleiche wie in main?
Warum ist nicht die Größe eines Arrays gesendet, die als parameter die gleichen wie im main?
#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));
}
InformationsquelleAutor der Frage Chris_45 | 2009-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keine, array-Typ ist implizit umgewandelt in Zeiger-Typ, wenn Sie übergeben es in eine Funktion.
So,
und
gleichwertig sind. Also, was Sie bekommen, ist der Wert von
sizeof(int*)
InformationsquelleAutor der Antwort
Wie andere gesagt haben, arrays decay Zeiger auf Ihr erstes element als Parameter der Funktion. Es ist auch erwähnenswert, dass sizeof nicht auswerten des Ausdrucks und erfordert keine Klammern, wenn Sie Sie mit einem Ausdruck, so dass Ihre parameter nicht verwendet wird, so kann man ebenso gut schreiben, das sizeof mit dem Typ und nicht den Wert.
InformationsquelleAutor der Antwort Pete Kirkham
Es ist ein Zeiger, deshalb ist es eine gemeinsame Umsetzung zu übergeben, die Größe des Arrays als zweiten parameter an die Funktion
InformationsquelleAutor der Antwort user240312
Also, werden Sie brauchen, um passieren die Länge des Arrays als zweiten parameter. Wenn Sie code schreiben, in dem Sie beide deklarieren Sie ein array konstanter Größe, und später übergeben, array an eine Funktion, es ist ein Schmerz, um die array-Länge konstant zeigen sich mehrere stellen im code...
K&R die Rettung:
So, jetzt können Sie tun e.g:
InformationsquelleAutor der Antwort S.C. Madsen
Da arrays Zerfall in Zeiger, wenn Sie als Parameter übergeben werden. Dies ist, wie C funktioniert, allerdings kann man die pass - "arrays" in C++ Referenz und überwinden dieses Problem. Beachten Sie, dass das übergeben von arrays in verschiedenen Größen, um diese Funktion:
InformationsquelleAutor der Antwort AraK
In c++ können Sie übergeben Sie ein array als Referenz für diese Zwecke :
InformationsquelleAutor der Antwort Alexandre C.
Das Verhalten, das Sie gefunden haben, ist tatsächlich eine große Warze in der C-Sprache. Wenn Sie deklarieren eine Funktion, die einen array-parameter, der compiler ignoriert Sie, und änderungen der parameter in einen Zeiger. Also diese Erklärungen alle Verhalten sich wie der erste:
einen wird ein Zeiger auf ein int in allen vier Fällen. Wenn Sie übergeben Sie ein array an Funktion, wird es sofort zerfallen in einen Zeiger auf sein erstes element. (Auf einem 64-bit system ein 64-bit-Zeiger ist doppelt so groß wie ein 32-bit-int, so dass Ihre sizeof Verhältnis gibt 2.)
Der einzige Zweck dieser Regel ist, um die Abwärtskompatibilität mit historischen Compiler, die nicht unterstützen die Weitergabe aggregierter Werte als Funktionsargumente.
Bedeutet dies nicht, dass es unmöglich ist, übergeben Sie ein array an eine Funktion. Sie können dies umgehen, Warze durch die Einbettung der array in ein struct (dies ist im Grunde der Zweck von C++11 std::array):
oder durch die übergabe eines Zeigers auf das array:
Im Falle der array-Größe ist nicht eine compile-time-Konstanten können Sie verwenden Sie das Zeiger-array-Technik mit C99 variable-length-arrays:
InformationsquelleAutor der Antwort Walter
In der Sprache C gibt es keine Methode, um zu bestimmen, die
die Größe eines unbekannten Arrays, also die Menge muss
übergeben werden, sowie einen Zeiger auf das erste element.
InformationsquelleAutor der Antwort
Können Sie nicht übergeben von arrays an Funktionen.
Wenn Sie wirklich etwas drucken wollte, die Größe, die Sie nicht passieren konnten, die einen Zeiger auf ein array, aber es wird nicht generisch sein und überhaupt, wie definieren Sie die array-Größe für die Funktion als gut.
InformationsquelleAutor der Antwort MR.
Das Verhalten ist by design.
Gleiche syntax Funktion parameter-Deklaration bedeutet was komplett anderes, als in lokalen Variablen-definition.
Der Grund ist beschrieben in den anderen Antworten.
InformationsquelleAutor der Antwort Pavel Radzivilovsky
In der C-Sprache, wenn Sie übergeben Sie das array als argument an die Funktion , wird es automatisch umgewandelt in Zeiger-array übergeben von einer Funktion eine andere Funktion wird auch als call by reference . Das ist der Grund, warum die aufgerufene Funktion erhält nur der pointer, die auf das erste element der Funktion Dies ist der Grund,
fun(int a[]) ist ähnlich wie fun(int *a) ;
so, wenn Sie drucken, Sie die Größe des Arrays, wird es drucken Sie die Größe des ersten Elements.
InformationsquelleAutor der Antwort dagrawal
In 'C' Programmiersprache 'sizeof()' ist der operator, und er liefert die Größe des Objekts in bytes.Argument der 'sizeof ()' - operator muss ein Links-Wert Typ(integer -, float-Zahl,struct,array).Also, wenn Sie wollen, um zu wissen, die Größe eines Arrays in bytes, die Sie tun können, es ist sehr einfach.Benutzen Sie einfach den 'sizeof ()' - operator und für sein argument mit dem array-Namen.Zum Beispiel:
Ausgabe auf 32-bit-system: Größe von n ist: 40.Da ineteger auf 32 system ist 4bytes.Auf 64x es ist 8bytes.In diesem Fall haben wir 10 ganze zahlen deklariert ein array.Also das Ergebnis ist " 10 * sizeof(int)'.
Einige Tipps:
Wenn wir ein array deklariert, wie dies ein 'int-n[]={1, 2, 3, ...155..};'.
Wir wollen also wissen, wie viele Elemente in diesem array gespeichert.
Verwenden Sie diese alghorithm:
sizeof(name_of_the_array) /sizeof(array_type)
Code: #include
main(){
}
InformationsquelleAutor der Antwort RichardGeerify
Arrays sind nur lose Größe. Für die meisten Teil, ein array ist ein Zeiger auf Speicher. Die Größe in Ihrer Erklärung nur teilt dem compiler mit, wie viel Speicher zu reservieren für die array - es ist nicht verbunden mit der Art, also sizeof() hat nichts mehr zu gehen.
InformationsquelleAutor der Antwort plinth