передача буфера символов функциям и получение размера буфера
Вопрос
Я установил для буфера размер 100.Я отображаю буфер в основной функции, где объявлен буфер.Однако, когда я передаю буфер в функцию и получаю sizeof '4', Я думал, что это должно быть 100, поскольку это размер буфера, который я создал в main.выходной сигнал:размер буфера:100 sizeof(буфер):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));
}
Решение
Вы используете размер указателя на буфер (4 байта), а не размер самого буфера.
В C вы должны передавать размер буфера отдельно, что является одной из причин, по которой переполнение буфера происходит так легко и часто.
void load_buffer(char * buffer, size_t bufSize)
{
...
}
Другие советы
Ответы Митча Уита и хафеза абсолютно верны и по существу.Я собираюсь показать некоторую дополнительную информацию, которая иногда может оказаться полезной.
Обратите внимание, что то же самое произойдет, если вы сообщите компилятору, что у вас есть массив нужного размера
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));
}
Это указатель на массив, который у вас есть в main, поэтому вам нужно разыменовать функцию, чтобы получить массив.Затем индексация выполняется с помощью
buffer[0][N] or (*buffer)[N]
Никто из моих знакомых этого не делает, и я тоже не делаю этого сам, потому что это довольно усложняет передачу аргументации.Но приятно знать об этом.Тогда вы можете вызвать функцию следующим образом
load_buffer(&buffer)
Если вы хотите принять и другие размеры, я бы выбрал вариант passing-N, который рекомендуют два других ответа.
Из ОП
void load_buffer(char *buffer) { printf("sizeof(buffer): %d\n", sizeof(buffer)); }
Даже если ты можешь себе это представить load_buffer()
передается ли buffer
кстати, что на самом деле происходит, так это то, что вы передаете указатель на char
Автор: ценность. Фактический массив не передается, поэтому нет никакого способа для load_buffer()
функция для определения размера буферного массива
Итак, что же такое sizeof(buffer)
делаешь?Это просто возвращает размер указателя на char .Если load_buffer()
необходим размер buffer
это нужно передавать осторожно.
Или вы можете создать новую структуру, которая содержит как массив символов, так и размер массива, и вместо этого передать указатель на эту структуру, таким образом, буфер и его размер всегда будут вместе ;)
Что происходит, так это когда вы передаете массив функции, вы передаете только адрес массива в памяти, а не размер массива.Какой sizeof(buffer) выводится в load_buffer() - это размер указателя, который равен четырем байтам.
Лучший способ сохранить размер буфера в функции - это изменить функцию на:
void load_buffer(char *buffer, int length);
и призыв к:
load_buffer(buffer, sizeof(buffer));
а затем используйте length всякий раз, когда вам нужен размер буфера.