C-Arrays als Funktionsparameter


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

schiese

Erfahrenes Mitglied
#1
Hallo,

ich habe eine Frage zu C-Arrays als Funktionsparameter.
C++:
int array[] {1,2,4,6,4,8,6,4,5};
int groesse = std::end(array) - std::begin(array);
std::cout << groesse;
Dieses funktioniert. Wenn ich das Array allerdings als Parameter einer Funktion übergebe, funktioniert es nicht mehr:
C++:
anzahlElemente(array);

void anzahlElemente(int a[]) {
    std::cout << sizeof(a); // gibt 4 aus (Die Größe des Zeigers in Byte)
//    std::cout << "Anzahl Elemente: " << (std::end(a) - std::begin(a)); // Fehler. Kompiliert nicht!
}
Das ein C-Array quasi ein konstanter Zeiger auf das erste Element des Arrays ist, ist mir klar. Wieso ist die Information über die Größe eines Arrays außerhalb des Sichtbarkeitsbereichs der Definition nicht mehr vorhanden?
 

zerix

Hausmeister
Moderator
#2
Hi,

die Information ist praktisch nie da. Im gleichen Sichtbarkeitsbereich weiß der Compiler wie groß das Array ist. Das heißt hier wird die Größe gar nicht berechnet, sondern direkt eingetragen:
Code:
│          
0x0000117c      mov dword [var_30h], 1
0x00001183      mov dword [var_2ch], 2
0x0000118a      mov dword [var_28h], 4
0x00001191      mov dword [var_24h], 6
0x00001198      mov dword [var_20h], 4
0x0000119f      mov dword [var_1ch], 8
0x000011a6      mov dword [var_18h], 6
0x000011ad      mov dword [var_14h], 4
0x000011b4      mov dword [var_10h], 5
0x000011bb      mov dword [var_34h], 9  <- größe
Wenn du das einer anderen Funktion/Methode übergibst, kann der Compiler nicht wissen wie groß das Array ist, da es keinen Terminator gibt, anhand die Größe festgestellt werden kann.


Viele Grüße
Sascha
 

schiese

Erfahrenes Mitglied
#3
Code:
│         
0x0000117c      mov dword [var_30h], 1
0x00001183      mov dword [var_2ch], 2
0x0000118a      mov dword [var_28h], 4
0x00001191      mov dword [var_24h], 6
0x00001198      mov dword [var_20h], 4
0x0000119f      mov dword [var_1ch], 8
0x000011a6      mov dword [var_18h], 6
0x000011ad      mov dword [var_14h], 4
0x000011b4      mov dword [var_10h], 5
0x000011bb      mov dword [var_34h], 9  <- größe
Hallo Sascha,

vielen Dank für deine Antwort. Darf ich fragen, wie du an den zitierten Code mit den Befehlen gekommen bist? So wird ja schön deutlich, was passiert :)

Viele Grüße
schiese
 

zerix

Hausmeister
Moderator
#4
Ja darfst du.

Unter Linux am einfachsten mit objdump.
Ich hatte es mit radare2 gemacht. Wenn man eine GUI möchte, kann man auch Ghidra verwenden. Beides sind aber schon eher richtige Reverse Engineering Tools und bedürfen schon etwas mehr Einarbeitung.

Viele Grüße
Sascha
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…