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
    4

    Nach 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


  • Mod

    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.


Anmelden zum Antworten