Передача буфера char в функции и получение размера буфера

Я установил буфер размером 100. Я отображаю буфер в основной функции, где объявлен буфер. Однако, когда я передаю буфер функции и получаю sizeof '4', Я думал, что это должно быть 100, так как это размер буфера, который я созданный в основном.   вывод:   размер буфера: 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));
}

Ответ 1

Вы используете размер указателя на буфер (4 байта), а не размер буфера.

В C вы должны передавать размер буфера отдельно, что является частью причины, когда переполнение буфера происходит так легко и часто.

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

Ответ 2

Ответы Митча Пшеница и хафеза совершенно правильны и точны. Я собираюсь показать некоторую дополнительную информацию, которая иногда может оказаться полезной.

Обратите внимание, что это происходит, если вы сообщите компилятору, что у вас есть массив нужного размера

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

Параметр массива просто объявляет указатель. Компилятор автоматически изменит это на char *name, даже если он был объявлен как char name[N].

Если вы хотите заставить вызывающих абонентов передать только массив размером 100, вы можете вместо этого принять адрес массива (и тип этого):

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

Это указатель на массив, который у вас есть в основном, поэтому вам нужно разыменовать функцию для получения массива. Затем индексирование выполняется

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

Никто, я знаю, не делает этого, и я не делаю этого сам, потому что это скорее усложняет передачу аргумента. Но хорошо знать об этом. Вы можете вызвать функцию, подобную этой, затем

load_buffer(&buffer)

Если вы хотите принять другие размеры, я бы пошел с параметром pass-N, который рекомендуют другие два ответа.

Ответ 3

От OP

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

Даже если вы можете представить, что load_buffer() передается buffer по refrence, что действительно происходит, вы передаете указатель на char значением .. Фактический массив не является поэтому нет возможности для функции load_buffer() знать размер массива буфера

Так что же делать sizeof(buffer)? Он просто возвращает размер указателя на char. Если load_buffer() требуется размер buffer, он должен быть передан speratly.

Или вы можете создать новую структуру, содержащую как массив char, так и размер массива, и вместо этого передать указатель на эту структуру, таким образом, буфер и его размер всегда будут вместе;)

Ответ 4

Что происходит, когда вы передаете массив функции, вы передаете только адрес массива в памяти, а не размер массива. Какой sizeof (buffer) выводится в load_buffer() - это размер указателя, который равен четырем байтам.

Лучший способ сохранить размер буфера в функции - изменить функцию на:

void load_buffer(char *buffer, int length);

и вызов:

load_buffer(buffer, sizeof(buffer));

а затем используйте длину, когда вы хотите размер буфера.