Pregunta

He configurado el búfer en tamaño 100. Muestro el búfer en la función principal donde se declara el búfer. Sin embargo, cuando paso el búfer a la función y obtengo el tamaño de '4', Estaba pensando que debería ser 100, ya que ese es el tamaño del búfer que yo creado en main.     salida:     tamaño del búfer: 100     sizeof (buffer): 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));
}
¿Fue útil?

Solución

Está utilizando el tamaño del puntero al búfer (4 bytes), en lugar del tamaño del búfer.

En C, tienes que pasar el tamaño del búfer por separado, lo cual es parte de la razón por la que los desbordamientos del búfer ocurren con tanta facilidad y frecuencia.

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

Otros consejos

Las respuestas de Mitch Wheat y hhafez son completamente correctas y precisas. Voy a mostrar alguna información adicional que puede ser útil a veces.

Tenga en cuenta que lo mismo sucede si le dice al compilador que tiene una matriz del tamaño correcto

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

Una matriz como parámetro solo está declarando un puntero. El compilador lo cambia automáticamente a char * name incluso si se declaró como char name [N] .

Si desea obligar a las personas que llaman a pasar una matriz de tamaño 100 solamente, puede aceptar la dirección de la matriz (y el tipo de esa) en su lugar:

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

Es un puntero a la matriz que tiene en main, por lo que debe desreferenciar la función para obtener la matriz. La indexación se realiza por

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

Nadie que conozco está haciendo eso y yo tampoco lo estoy haciendo, porque complica bastante el paso del argumento. Pero es bueno saberlo. Puede llamar a la función de esta manera, entonces

load_buffer(&buffer)

Si desea aceptar otros tamaños también, iría con la opción de pasar N que recomiendan las otras dos respuestas.

Desde el OP

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

Aunque puede imaginar que load_buffer () pasa el buffer por referencia, lo que realmente está sucediendo es que está pasando un puntero a char por valor. La matriz real no se pasa, por lo que no hay forma de que la función load_buffer () sepa el tamaño de la matriz de búfer

Entonces, ¿qué está haciendo sizeof (buffer) ? Simplemente está devolviendo el tamaño de un puntero a char. Si load_buffer () necesita el tamaño del búfer , debe pasarse de forma precisa.

O puede crear una nueva estructura que contenga una matriz de caracteres y el tamaño de la matriz, y pasar un puntero a esa estructura en su lugar, de esa manera el búfer y su tamaño siempre están juntos;)

Lo que sucede es que cuando se pasa una matriz a una función, solo se pasa la dirección de la matriz en la memoria, no el tamaño de la matriz. El tamaño de (buffer) que se genera en load_buffer () es el tamaño del puntero, que es de cuatro bytes.

La mejor manera de mantener el tamaño del búfer en la función es cambiar la función a:

void load_buffer(char *buffer, int length);

y la llamada a:

load_buffer(buffer, sizeof(buffer));

y luego use la longitud siempre que desee el tamaño del búfer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top