Передача буфера 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));
а затем используйте длину, когда вы хотите размер буфера.