sizeof array clearing

8

Ich studiere für morgen ein Finale in C und habe eine Frage bezüglich der Größe des Operators.

Nehmen wir an, die Größe eines int ist 32 Bits und ein Zeiger ist 64 Bits.

Wenn es eine Funktion gab:

%Vor%

Da zap ein Zeiger ist, würde foo 8 zurückgeben, da so viele Bytes benötigt werden, um diesen bestimmten Zeiger zu speichern. Mit dem folgenden Code jedoch:

%Vor%

i wäre 6 * sizeof(int) = 6 * 4 = 24

Warum gibt sizeof(zip) die Anzahl der Elemente mal der Größe jedes Elements zurück, während sizeof(zap) die Größe eines Zeigers zurückgibt? Ist die Größe von zap nicht angegeben und zip nicht? Der Compiler weiß , dass zip 6 elements ist, aber keine Ahnung hat, wie groß zap sein kann.

    
Fred 09.05.2011, 06:21
quelle

6 Antworten

8

Dies ist eine Art Asymmetrie in der C-Syntax. In C ist es nicht möglich, ein Array an eine Funktion zu übergeben. Wenn Sie also die Array-Syntax in einer Funktionsdeklaration für einen der Parameter verwenden, liest der Compiler sie stattdessen als Zeiger.

In C wird das Array in den meisten Fällen, wenn Sie ein Array in einem Ausdruck verwenden, implizit in einen Zeiger auf sein erstes Element konvertiert, und genau das passiert zum Beispiel, wenn Sie eine Funktion aufrufen. Im folgenden Code:

%Vor%

Das Array wird in einen Zeiger auf das erste Element konvertiert, und genau das erhält die Funktion.

Diese Regel der Implizierungskonvertierung wird jedoch nicht immer angewendet. Wie Sie zum Beispiel herausgefunden haben, arbeitet der Operator sizeof im Array, und sogar der Operator & (Adresse-von) arbeitet am ursprünglichen Array (d. H.% Co_de%).

Eine Funktion in C kann ein Array nicht als Parameter empfangen, es kann nur einen Zeiger auf das erste Element oder einen Zeiger auf ein Array empfangen ... oder Sie müssen das Array in eine Struktur einfügen.

Auch wenn Sie in der Funktionsdeklaration eine Zahl zwischen die Klammern setzen ...

%Vor%

Diese Zahl wird vom Compiler vollständig ignoriert ... diese Deklaration für den Compiler ist völlig äquivalent zu

%Vor%

und zum Beispiel wird das Aufrufen eines Arrays mit einer anderen Größe auch keinen Fehler auslösen ...

%Vor%

(eigentlich ein Compiler MAY gibt eine Warnung, aber der Code ist absolut legal C und muss akzeptiert werden, wenn der Compiler dem Standard folgt)

Wenn Sie denken, dass diese Regel über Arrays in Funktionsargumenten seltsam ist, stimme ich zu, aber so ist die C-Sprache definiert.

    
6502 09.05.2011, 06:51
quelle
2

Weil zip ein Array ist und der Compiler seine Größe bei Kompilierzeit kennt. Es ist nur ein Fall der Verwendung derselben Notation für zwei verschiedene Dinge, etwas, das in C ziemlich üblich ist.

%Vor%

entspricht vollständig

%Vor%

Der Compiler hat keine Ahnung, wie groß der Zap sein könnte (so dass er die Aufgabe hat, den Programmierer zu finden).

    
cnicutar 09.05.2011 06:23
quelle
2

zip ist ein Speicherblock von 6 * sizeof(int) , also hat er eine Größe von 24 (auf Ihrer Architektur). zap (es könnte auch in Ihrer Funktionsdeklaration als int *zap geschrieben werden), kann jedoch auf eine beliebige Speicheradresse verweisen, und der Compiler kann nicht wissen, wie viel Speicherplatz ab dieser (oder sogar dieser) Adresse zugewiesen wurde.

    
ThiefMaster 09.05.2011 06:26
quelle
0

Die Größe von zip ist zur Kompilierzeit bekannt und die Größe von zap nicht. Deshalb erhalten Sie die Größe eines Zeigers auf sizeof(zap) und die Größe des Arrays auf sizeof(zip) .

    
Tony The Lion 09.05.2011 06:25
quelle
0
___ answer5933275 ___

Weil zip ein Array ist und der Compiler seine Größe bei Kompilierzeit kennt. Es ist nur ein Fall der Verwendung derselben Notation für zwei verschiedene Dinge, etwas, das in C ziemlich üblich ist.

%Vor%

entspricht vollständig

%Vor%

Der Compiler hat keine Ahnung, wie groß der Zap sein könnte (so dass er die Aufgabe hat, den Programmierer zu finden).

    
___ qstntxt ___

Ich studiere für morgen ein Finale in C und habe eine Frage bezüglich der Größe des Operators.

Nehmen wir an, die Größe eines %code% ist %code% Bits und ein Zeiger ist %code% Bits.

Wenn es eine Funktion gab:

%Vor%

Da %code% ein Zeiger ist, würde %code% %code% zurückgeben, da so viele Bytes benötigt werden, um diesen bestimmten Zeiger zu speichern. Mit dem folgenden Code jedoch:

%Vor%

%code% wäre %code% = %code% = %code%

Warum gibt %code% die Anzahl der Elemente mal der Größe jedes Elements zurück, während %code% die Größe eines Zeigers zurückgibt? Ist die Größe von %code% nicht angegeben und %code% nicht? Der Compiler weiß , dass %code% %code% elements ist, aber keine Ahnung hat, wie groß %code% sein kann.

    
___ answer5933307 ___

%code% ist ein Speicherblock von %code% , also hat er eine Größe von 24 (auf Ihrer Architektur). %code% (es könnte auch in Ihrer Funktionsdeklaration als %code% geschrieben werden), kann jedoch auf eine beliebige Speicheradresse verweisen, und der Compiler kann nicht wissen, wie viel Speicherplatz ab dieser (oder sogar dieser) Adresse zugewiesen wurde.

    
___ answer5933297 ___

Die Größe von %code% ist zur Kompilierzeit bekannt und die Größe von %code% nicht. Deshalb erhalten Sie die Größe eines Zeigers auf %code% und die Größe des Arrays auf %code% .

    
___ answer593365 ___

Es gibt einige Situationen, in denen Arrays zu Zeigern zerfallen. Funktionsaufrufe gehören dazu.

    
___ qstnhdr ___ sizeof array clearing ___ answer5933289 ___

weil es statisch mit 6 Elementen initialisiert wurde.

    
___ answer5933544 ___

Dies ist eine Art Asymmetrie in der C-Syntax. In C ist es nicht möglich, ein Array an eine Funktion zu übergeben. Wenn Sie also die Array-Syntax in einer Funktionsdeklaration für einen der Parameter verwenden, liest der Compiler sie stattdessen als Zeiger.

In C wird das Array in den meisten Fällen, wenn Sie ein Array in einem Ausdruck verwenden, implizit in einen Zeiger auf sein erstes Element konvertiert, und genau das passiert zum Beispiel, wenn Sie eine Funktion aufrufen. Im folgenden Code:

%Vor%

Das Array wird in einen Zeiger auf das erste Element konvertiert, und genau das erhält die Funktion.

Diese Regel der Implizierungskonvertierung wird jedoch nicht immer angewendet. Wie Sie zum Beispiel herausgefunden haben, arbeitet der Operator %code% im Array, und sogar der Operator %code% (Adresse-von) arbeitet am ursprünglichen Array (d. H.% Co_de%).

Eine Funktion in C kann ein Array nicht als Parameter empfangen, es kann nur einen Zeiger auf das erste Element oder einen Zeiger auf ein Array empfangen ... oder Sie müssen das Array in eine Struktur einfügen.

Auch wenn Sie in der Funktionsdeklaration eine Zahl zwischen die Klammern setzen ...

%Vor%

Diese Zahl wird vom Compiler vollständig ignoriert ... diese Deklaration für den Compiler ist völlig äquivalent zu

%Vor%

und zum Beispiel wird das Aufrufen eines Arrays mit einer anderen Größe auch keinen Fehler auslösen ...

%Vor%

(eigentlich ein Compiler MAY gibt eine Warnung, aber der Code ist absolut legal C und muss akzeptiert werden, wenn der Compiler dem Standard folgt)

Wenn Sie denken, dass diese Regel über Arrays in Funktionsargumenten seltsam ist, stimme ich zu, aber so ist die C-Sprache definiert.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___
ninjalj 09.05.2011 06:42
quelle
-1

weil es statisch mit 6 Elementen initialisiert wurde.

    
Aaron Gage 09.05.2011 06:24
quelle

Tags und Links