C Arrayparameter falsch übergeben?
-
Hi,
Ich bastle gerade an ner kleinen C Bibliothek zu Lernzwecken. Leider gibt es da eine Ungereimtheit, die ich nicht verstehe.
libb64.h
#ifndef LIBB64_H #define LIBB64_H typedef unsigned char byte; int encodeBase64(byte*); #endif
libb64.c
#include "libb64.h" int encodeBase64(byte *bytes) { return sizeof(bytes); }
main.c - ein Testprogramm für die lib
#include <dlfcn.h> #include <stdio.h> #include <stdlib.h> #include "libb64.h" int main(int argc, char **argv) { // function pointers typedef int (*EncodeBase64)(byte*); void *dll = dlopen("libb64.so", RTLD_LAZY); // open so // load symbols EncodeBase64 encodeBase64 = (EncodeBase64) dlsym(dll, "encodeBase64"); // Hier erzeuge ich ein Byte-Array ( byte = unsigned char, siehe header) byte testbytes[] = {1,2,3,4,5,6,7}; // Nun gebe ich die Größe aus, Ausgabe 7, da 7 bytes im Array printf("%i\n", sizeof(testbytes)); // Jetzt übergebe ich das Array einer Funktion, // die im Grunde das selbe macht wie obige Anweisung printf("%i\n", encodeBase64(testbytes)); dlclose(dll); // close so return 1; }
Programmausgabe:
7
4Nach der Übergabe des Arrays an die Funktion gibt der sizeof() operator einen falschen wert zurück.
Ich habe schon ohne Erfolg versucht die Funktionsparameter von byte* zu byte[] zu ändern, Ergebnis blieb das Gleiche.
Weiß jemand weiter?
-
Du kannst keine Arrays an Funktionen übergeben. Bzw. du kannst zwar ein Array als Parameter an eine Funktion übergeben, im Kontext der Funktion wird daraus aber ein Zeiger.
Am besten mal die ganzen Fragen/Antworten hier durchackern, das muss sitzen
http://c-faq.com/aryptr/index.html
-
Das sizeof liefert dir natürlich die Größe eines byte*, schließlich ist bytes von diesem Typ und woher soll das sizeof wissen, dass du eigentlich das dahinterliegende Array meinst? Die beiden Möglichkeiten in einer Funktion die Größe eines übergebenen Arrays herauszubekommen sind:
1. Die Größe als Parameter mit übergeben. Dies ist der übliche Weg.
2. Eine Konvention einführen, zum Beispiel dass das letzte Element im Array durch 0 markiert wird. Dann darf die 0 natürlich nicht mehr in den normalen Daten vorkommen. Dies ist der übliche Weg bei der Zeichenkettenverarbeitung in C, welche über char-Arrays erfolgt.
-
Tim schrieb:
Du kannst keine Arrays an Funktionen übergeben.[...] im Kontext der Funktion wird daraus aber ein Zeiger.
Das habe ich auch gerade im C openbook gelesen.
Zum Beitrag von SeppJ:
Danke, jetzt hab ich auch endlich genau den Sinn der \0-terminierten Strings begriffen.Ich werde als zweiten Parameter die Anzahl der Bytes mit übergeben.
Danke.
-
Naja, Zeiger auf Arrays kann man schon an Funktionen übergeben und die Arrays dann auch wie meist gewünscht nach ihrer Größe fragen.