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

StackOverflow https://stackoverflow.com/questions/609267

  •  03-07-2019
  •  | 
  •  

Вопрос

Я установил для буфера размер 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 всякий раз, когда вам нужен размер буфера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top