Frage

Ich habe den Puffer Größe 100 eingestellt. Ich zeige den Puffer in der Hauptfunktion, wo der Puffer deklariert wird. Allerdings, wenn ich den Puffer an die Funktion übergeben und die sizeof ‚4‘ erhalten, Ich dachte, es sollte 100 sein, wie die Größe des Puffers ist, dass ich in Haupt erstellt.     Ausgabe:     Puffergröße: 100     sizeof (Puffer): 4

#include <string.h>
#include <stdio.h>

void load_buffer(char *buffer);

int main()
{
    char buffer[100];
    printf("buffer size: %d\n", sizeof(buffer));
    load_buffer(buffer);

    return 0;
}

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}
War es hilfreich?

Lösung

Sie haben die Größe des Zeigers auf den Puffer (4 Byte), anstatt die Größe des Puffers.

In C haben Sie die Größe des Puffers separat passieren, was einen Teil des Grundes ist Überschreitungen Puffer so leicht passieren, und häufig.

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}

Andere Tipps

Die Antworten von Mitch Weizen und hhafez sind vollständig nach rechts und auf den Punkt. Ich werde einige zusätzliche Informationen zeigen, die manchmal nützlich erweisen.

Beachten Sie, dass das gleiche passiert, wenn Sie den Compiler sagen, dass Sie ein Array von der richtigen Größe haben

void load_buffer(char buffer[100]) {
    /* prints 4 too! */
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

Ein Array als Parameter deklarieren nur einen Zeiger. Der Compiler ändert sich automatisch, dass auf char *name auch wenn es als char name[N] erklärt wurde.

Wenn Sie Anrufer erzwingen wollen 100 nur eine Reihe von Größe zu übergeben, können Sie die Adresse des Arrays akzeptieren (und die Art der der) statt:

void load_buffer(char (*buffer)[100]) {
    /* prints 100 */
    printf("sizeof(buffer): %d\n", sizeof(*buffer));
}

Es ist ein Zeiger auf das Array, das Sie in Haupt haben, so müssen Sie in der Funktion zu dereferenzieren das Array zu erhalten. Indexing dann erfolgt durch

buffer[0][N] or (*buffer)[N]

Niemand weiß ich tut, und ich bin weder es selbst zu tun, weil es eher beiläufig des Arguments erschwert. Aber es ist gut, darüber zu wissen. Sie können die Funktion wie folgt aufrufen dann

load_buffer(&buffer)

Wenn Sie andere Größen akzeptieren wollen, würde ich mit dem Verlauf-N-Option gehen die beiden anderen Antworten empfehlen.

Von der OP

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

Auch wenn man sich vorstellen kann, dass load_buffer() die buffer von refrence übergeben wird, was wirklich passiert ist, dass Sie einen Zeiger sind vorbei Wert char. Die tatsächliche Array nicht übergeben wird, so gibt es keine Möglichkeit gibt, für die load_buffer() Funktion der Größe des Pufferarray wissen

Was tut sizeof(buffer)? Es kehrt einfach die Größe eines Zeigers auf char. Wenn load_buffer() die Größe des buffer braucht es braucht speratly weitergegeben werden.

Sie können auch eine neue Struktur schaffen, die sowohl eine char-Array und die Größe des Arrays enthält, und übergeben Sie einen Zeiger auf, dass statt struct, auf diese Weise den Puffer und es ist Größe sind immer zusammen;)

Was passiert, ist, wenn Sie ein Array an eine Funktion übergeben, nur die Adresse des Arrays im Speicher übergeben, nicht die Größe des Arrays. Welche sizeof (Puffer) wird in load_buffer Ausgeben () ist die Größe des Zeigers, die vier Bytes ist.

Der beste Weg, um die Größe des Puffers in der Funktion zu halten ist, um die Funktion zu ändern:

void load_buffer(char *buffer, int length);

und der Anruf an:

load_buffer(buffer, sizeof(buffer));

und dann Länge verwenden, wenn Sie die Größe des Puffers wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top